这是我参加最近一次采访时的一个问题,我觉得很有意思。假设int n = 10;
输入:数组int a[10];
输出:数组float b[10];
要求:
b[0]= a[1]*a[2]*...a[9]; // product of all numbers in a, other than a[0];
b[1]= a[0]*a[2]*...a[9]; // product of all numbers in a, other than a[1];
....
b[9]= a[0]*a[1]*...a[8]; // product of all numbers in a, other than a[9];
....
问题:如何在不使用除法运算符b
的情况下使用填充数组/
?并使用O(n)
算法?
我尝试了很多方法,但仍然徒劳无功。有什么想法吗?
答案 0 :(得分:15)
首先,计算所有左右产品:
left[i] = a[0]*a[1]*...*a[i]
right[i] = a[i]*a[i+1]*...*a[n-1]
请注意left[i] == left[i-1] * a[i]
,因此可以在线性时间内计算left
数组。同样地,right
数组可以在线性时间内计算。
从left
和right
开始,数组b
可以按b[i] = left[i-1] * right[i+1]
的线性时间计算i == 0
和i == n
的特殊情况
答案 1 :(得分:1)
根据Egor Skriptunoff的想法,我写了这段代码:它更容易理解:
float l[n];
float r[n];
left[0] = 1;
right[n-1] = 1;
for (int i=1; i<n; i++)
{
l[i] = l[i-1]*a[i-1];
}
for (int i=n-2; i>=0; i--)
{
r[i] = r[i+1]*a[i+1];
}
for (int i=0; i<n; i++)
{
b[i] = l[i]*r[i];
}