很久没动过什么脑,做脑力训练了,今天正好看到 一道面试附加题的另类求解 ,原题是“4月7日某公司在华南地区举办了一年一度的"开发者"聚会——记某公司笔试”
,其是要求为:
题目:已知一个数组a[N],构造一个数组b[N],构造规则:b[i]=a[0]*a[1]*a[2]...a[N]/a[i];
要求:
1、不可以使用除法;
2、时间复杂度为O(n),空间复杂度为S(0);
3、除遍历使用的变量外,不可以使用其它变量;
一看到这题,在纸上一画,
b[0]=a[1]*a[2]..a[n]
b[1]=a[0]*a[2]..a[n]
b[2]=a[0]*a[1]..a[n]
...
b[n]=a[0]*a[1]..a[n-1]
很快就想到十几年前学习C时的杨辉三角了,也凑个热闹写一个,用MonoDevelop 写下一个快速原型
class MainClass
{
public static void Main (string[] args)
{
const int low=0,len=5;
const int high=len-1;
//初始化原始数组
int[] a=new int[len];
for(int i=low;i<=high;i++)
{
a[i]=i+1;
}
int[] b=new int[len];
b[low]=1;//形成左边的三角
for(int i=low+1;i<=high;i++)
{
b[i]=a[i-1]*b[i-1];
}
//利用b[0]形成倒三角
for(int i=high;i>low;i--)
{
b[i]=b[i]*b[low];
b[low]=b[low]*a[i];
}//输出结果
for(int i=low;i<=high;i++)
{
Console.WriteLine(b[i]);
}
}
{
public static void Main (string[] args)
{
const int low=0,len=5;
const int high=len-1;
//初始化原始数组
int[] a=new int[len];
for(int i=low;i<=high;i++)
{
a[i]=i+1;
}
int[] b=new int[len];
b[low]=1;//形成左边的三角
for(int i=low+1;i<=high;i++)
{
b[i]=a[i-1]*b[i-1];
}
//利用b[0]形成倒三角
for(int i=high;i>low;i--)
{
b[i]=b[i]*b[low];
b[low]=b[low]*a[i];
}//输出结果
for(int i=low;i<=high;i++)
{
Console.WriteLine(b[i]);
}
}
}
再抽取一下子函数就可以了