原創 2013騰訊實習生筆試附加題1及解法

2022-08-02 19:03:08 字數 1773 閱讀 9991

題目大概描述:已知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 分析 ...