騰訊的一道面試題 不用除法求數字乘積

2021-09-01 09:43:31 字數 777 閱讀 7726

已知乙個包含n個元素的陣列a[n],試求出這樣乙個陣列output[n],其中output[i]的值為陣列a中除了a[i]的其他所有元素的乘積。注意,不能使用除法。時間複雜度必須為o(n)。

例如output[0]的值為a[1]*a[2]...a[n], output[1]的值為a[0]*a[2]...a[n]。

假定陣列a=,則output=。

初看此題,覺得很無聊,這個題目貌似沒有什麼意義。要是可以用除法,直接output[i]=a[0]*a[1]...a[n]/a[i]。

但是不能用除法,而且時間複雜度為o(n),確實一時還難以想到好的解法。如果使用暴力方法,每次求output[i]都暴力計算一遍,那麼時間複雜度為o(n^2),達不到o(n)的要求。

我們可以定義乙個陣列b,其中元素b[i]的值為a[0]到a[i]的乘積,即b[i]=a[0]*a[1]...a[i]。假如a = ,則b = 。然後從右向左掃瞄陣列a,並使用乙個變數product記錄從右向左掃瞄到當前位置的乘積。從而output[i]=b[i-1]*product.

上面的方法採用o(n)的時間和o(n)的空間,那麼是否還有更好的辦法呢?是否能省去這o(n)的空間呢?

確實是的,這o(n)的空間確實可以省去。我們使用2個變數就可以滿足要求。使用變數left儲存從左向右掃瞄陣列a的乘積,使用變數right儲存從右向左掃瞄陣列a的乘積。

void array_multiplication(int a, int output, int n) 

}

一道騰訊面試題

view plainprint?已知有個rand7 的函式,返回1到7隨機自然數,讓利用這個rand7 構造rand10 隨機1 10。using system using system.collections.generic using system.linq using system.text ...

試著解一道騰訊面試題

帖子問題 同學去面試的 1 設計乙個魔方 六面 的程式。2 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有重複。請用5分鐘時間,找出重複出現最多的前10條。3 收藏了1萬條url,現在給你一條url,如何找出相似的url。面試官不解釋何為相似 想了一中午,寫了一下午 真服了自己,這麼鑽牛...

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...