題目大概描述:已知ab兩個陣列 a[n] b[n],b[i] = a[0] * a[1] *...a[i] *...*a[n-1] / a[i] ,不允許使用除法,以及其他輔助儲存(堆什麼的。。這個忘了),允許的操作是迭代器遍歷a[n],b[n],根據a[n]生成b[n],要求空間複雜度是o(1),時間複雜度為o(n).
**如下:
#include
#define n 4
using
namespace std;
int main()
;int b[n];
int i;
for(i=0;iif(i>0)
a[i] *= a[i-1];
}int temp = b[n-1];
b[n-1] = a[n-2];
a[n-1] = temp;
for(i=n-2;i>0;i--)
b[0] = a[1];
for(i = 0;i"
pause
");return0;}
具體思路給大家講解一下,先把a的元素複製到b中對應的單位裡,同時對a中的元素進行迭代,a[i] *= a[i-1](i>0)
到了n-1元素的時候,即a[n-2]等於a[0]...a[n-2]的乘積,剛好等於b[n-1]的定義,此時這個變數應該儲存到b[n-1]的位置
舉n = 4 為例,我們畫圖來說明此過程:
首先 經過上述操作後,a[n] b[n] 中的元素情況如下:
11*2
1*2*3
1*2*3*4
b[0]b[1]b[2]b[3]12
31*2*3(原來為4)
在上一行中是b[n]中每個元素的值的構成, 此時,我們注意到b[n-2]元素的構成,1*2*4,1*2正好等於a[n-3]的值,那麼4從哪兒來呢,我們又注意到a[n-1]的值,是不是沒有使用?那麼我們可以把b[n-1]的值存到a[n-1]中,經過一次這樣的操作,ab陣列的值如下:
a[0]a[1]a[2]a[3]
11*2
1*2*3
4b[0]b[1]b[2]b[3]
12(1*3*4)
1*2*4(原來為3)
1*2*3
此時看b[n-3],即b[1]的構成,根據上面的思路,我們在a[0]中找到乙個1,那麼剩下的3和4從哪兒來呢,往後看,b[2]原來不就是3嗎,由於此時a[2]已經沒用了,我們是不是可以把3*4的結果存放在a[2]裡呢?這次操作的結果如下:
a[0]a[1]a[2]a[3]
11*2
3*44
b[0]b[1]b[2]
b[3]
1(2*3*4)
1*3*4(原來為2)
1*2*4
1*2*3
到b[0]的時候,觀察到b[1]和a[2]分別為2 和 3*4,a[1]已經沒用了,那麼可以把b[1]和a[2]的乘積存放到b[0]裡,用乙個迴圈將上述過程copy下來,迴圈結束後,將a[1]的值賦給b[0]即完成了整個過程。 如下圖:
a[0]a[1]a[2]a[3]
12*3*4
3*44
b[0]b[1]b[2]
b[3]
2*3*4
1*3*4
1*2*4
1*2*3
嗯 總體就是這樣了 時間空間複雜度滿足題目的要求。
騰訊實習生筆試題
一 單項選擇題 1 給定3個int型別的正整數x,y,z,對如下4組表示式判斷正確的選項 int a1 x y z int b1 x y z int a2 x z y int b2 x z y int c1 x z int d1 x y z int c2 x z a a1一定等於a2 b b1一定定...
2012 4 7騰訊實習生筆試題 附加題1
1 根據a n 陣列求b n b i a 0 a 1 a n 1 a i 要求空間複雜度是o 1 時間複雜度是o n 除了a n b n 和迴圈計數器,不使用其他變數,不能使用除法。第一種方法 void f int a,int b,int n if n 1 b 0 1 實現b i a i a i 1...
2012騰訊實習生筆試題
問題描述 兩個陣列a n b n 其中a n 的各個元素值已知,現給b i 賦值,b i a 0 a 1 a 2 a n 1 a i 要求 1.不准用除法運算2.除了迴圈計數值,a n b n 外,不准再用其他任何變數 包括區域性變數,全域性變數等 3.滿足時間複雜度o n 空間複雜度o 1 分析 ...