2008百度校園招聘題一道

2021-04-14 06:06:03 字數 1288 閱讀 6971

題目大意如下:

一排n(最大1m)個正整數+1遞增,亂序排列,第乙個不是最小的,把它換成-1,最小數為a且未知求第乙個被

-1替換掉的數原來的值,並分析演算法複雜度。

解題思路:

一般稍微有點演算法知識的人想想就會很容易給出以下解法:

設 sn = a + (a+1) + (a+2) + .........+ (a+n-1) = na +n(n-1)/2

掃一次陣列即可找到最小值a,時間複雜度o(n)

設 s = 修改第一項後所有陣列項之和,  求和複雜度為o(n)

則被替換掉的第一項為  a1=sn-s-1

總的時間複雜度為 o(1)+o(n)+o(n) = o(n)

根據該演算法寫出程式很簡單,就不寫了

主要是解題過程中沒有太考慮題目中給的1m這個數字,一面的時候被問到求和溢位怎麼辦?

當時我一想,如果要考慮溢位,必然是要處理大數問題,以前沒有看到大數就頭疼……所以立馬想了個繞過大數加法的方法,如下:

設定另外乙個陣列b[n]

用 a, a+1,a+2....a+n-1依次分別減去原陣列,得到的差放在該陣列裡,此求差過程複雜度為o(n)

對該陣列各項求和即可得到sn-s

面試官讓證明一下我的設想,當時還沒有給我紙和筆,用手在桌子上比劃了一下沒想出來,回來躺在床上想了一會就想出來了,也沒什麼難度: 

相減求和後的陣列,最差情況下應該是連續n/2個負數或者正數相加,如果不溢位,後面正負混合相加的話肯定不會溢位;這種情況下的最差特殊情況就是,原數列按照降序排列(除了第一項被替換掉了),而我們減時所用數列是增序排列。所得結果將是1個正數,n/2-1個負數,n/2個正數;而且我們相當於用最大的n/2個數減去最小的n/2個數,差值之和最大,取到了最差情況,我們只考慮後面一半求和的情況即可(前面有個-1不方便處理):

s(n/2) = (n-1) + (n-3) + (n-5)+ .....+ 1    (n為奇數時最後一項是0,不影響我們討論數量級計算溢位)

= [(n-1)+1] * n/4 = n^2/4

題目中給定n最大為1m = 1024*1024

那麼s(n/2)的最大量級為1024^4 = 2^40

而long long型別為64位,可以存放下該和,成功避免大數問題。

直接求和辦法,一是和可能溢位,二是面試官要求把原始陣列改稱long long的話(即a可以也可能很大,求和時稍微加一下就會溢位)就得考慮大數求解了;而這種差值辦法可以直接消掉a,求和只和n相關,和a無關。

百度2013校園招聘題

第一題,基礎題 1.資料庫及執行緒產生死鎖的原理和必要條件,如何避免死鎖。2.列舉物件導向程式設計的三個要素和五項基本原則。解答 封裝,繼承,多型物件導向的五大基本原則 單一職責原則 srp 開放封閉原則 ocp 黎克特制替換原則 lsp 依賴倒置原則 dip 介面隔離原則 isp 單一職責原則 s...

百度09年校園招聘交大考點的一道題

找出下面程式中的錯誤,並改正 include include include using namespace std class test public string s main test t new test 3 ofstream output file ofstream binary t 0 ...

一道百度架構題

無論筆試還是面試總會被問到一些架構題,關鍵還無法理解面試官究竟在問什麼。開始積累這些題吧,放到下面 關於海量資料儲存與訪問,涉及到分庫,分表,可以參考此文 1 有乙個監控系統,有大量的資料記錄包括 url,使用者訪問ip,時間 要對這個監控系統進行維護,並提供查詢。設計乙個能儲存和維護1000億條記...