某筆試附加題解法

2022-03-23 06:36:53 字數 1183 閱讀 3404

剛進就在《一道面試附加題的另類求解》看到一道有趣的題,正好,偶對這題也有一些想法,因此寫來分享下。題目如下:

先來看第乙個條件,不可用除法。要滿足這個條件倒是很簡單:

令forward[i] = a[0] * a[1] *... * a[i];

backward[i] = a[i] * a[i+1] *...* a[n];

那麼b[i] = forward[i-1] * backward[i+1];

在此基礎上,我們再來看一下第2個條件,時間複雜度為0(n),空間複雜度為o(1)。

先將forward和backward陣列的值算出,然後才算b陣列的值雖然可以滿足時間的要求,但空間要求卻滿足不了。因此有必要減少空間的使用量。仔細地觀察forward陣列,就會發現這個陣列可以用乙個變數代替。而backward陣列的每個元素只使用一次,並且是按順序使用的。那麼如果將backward陣列的值放到b組中,不就可以解決這個問題了。具體**如下:

int zero(int a, int b, int n) 

int forward = 1;

for(i = 0; i < n - 1; ++i)

b[n - 1] = forward;

}

現在只剩下第三個條件——只能使用遍歷變數的限制了。上面的方法只要去掉forward這個區域性變數就滿足全部條件。在思考怎樣去掉之前,不防回顧前面是怎樣去掉backward陣列的。沒錯,利用了b陣列暫時沒用到的性質。那麼去掉forward的方法也可以如法炮製。

void zero(int a, int b, int n) 

b[n - 1] = 1; //

use as forward

for(i = 0; i < n - 2; ++i)

b[n - 2] = b[n - 1] * a[n - 1];

b[n - 1] = b[n - 1] * a[n - 2];

}

一點思考:

就通常來說,程式設計是主張一物一用,乙個函式最好只完成乙個功能,即乙個物體不要同時用於多個用途。因為這樣的**易於閱讀和維護。但是卻有不能這樣做的時候,例如本題,例如在一台普通pc上處理大資料。在這樣的時候,只能打破這些約束了。因為如果功能都完成不了,還談什麼閱讀與維護。

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

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

某廠筆試題

1 去附近店鋪買橘 前商店做活動,提供 打包銷售,例如每袋3個和每 袋5個的形式 現 只想購買n個橘 同時想購買盡量少的袋數 便攜帶。如 果不能購買恰好n個橘 就不會購買 可返回 1 求解輸出最少的袋數。例如 18 如題可知,求最少袋子的數量,眾所周知,5大於3 所以優先計算出可以被5除的部分,剩下...

top K 問題解法

問題描述 從arr 1,n 這n個數中,找出最大的k個數,這就是經典的topk問題。栗子 從arr 1,12 這n 12個數中,找出最大的k 5個。一 排序 排序是最容易想到的方法,將n個數排序之後,取出最大的k個,即為所得。偽 sort arr,1,n return arr 1,k 時間複雜度 o...