2012百度實習生招聘面試題

2022-03-04 10:07:15 字數 3423 閱讀 9517

一面:

第一題、任意給乙個數,試證明這個數的某個倍數的十進位制表示是01串,比如3的倍數111是二進位制表示,5的倍數10是二進位制表示,等等。

假設序列1,11,111,1111…用a1~an標識,下腳標n即為1的個數,如:a1=1,a2=11,a3=111…

其中沒有乙個是n的倍數,即ak mod n不等於0(k屬於1~n),並且ak mod n的餘數各不相同,設它們為a1,a2,a3,…,an,但ak mod n的餘數最多只有n-1個不同,則由鴿巢原理可知,a1,a2,a3,…,an中必有兩個相同,即ai=aj(j>i),則aj-ai=0(mod n),aj-ai即為所求的0和1組成的十進位制數m,得證。

第二題、證明素數有無窮多個。

假若素數只有有限多個,設最大的乙個是p,從2到p的全體素數是:

2,3,5,7,11……,p。

所有的素數都在這裡,此外再沒有別的素數了。

現在,我們來考察上面從2到p的全體素數相乘、再加上1這個數,設它是a,即

a=2×3×5×7×11×……×p+1。

a是乙個大於1的正整數,它不是素數,就是合數。

如果a是素數,那麼,就得到了乙個比素數p還要大的素數,這與素數p是最大素數的假設矛盾。

如果a是合數,那麼,它一定能夠被某個素數整除,設它能被g整除。

因為a被從2到p的任何乙個素數除,餘數都是1,就是都不能整除,而素數g是能整除a的,所以素數g不在從2到p的全體素數之中。這說明素數g是乙個比素數p更大的素數,這又與p是最大的素數的假設矛盾。

上面的證明否定了素數只有有限多個的假定,這就證明了素數是無窮多個。

第三題、給乙個很大的陣列,裡面有兩個數隻出現過一次,其他數都出現過兩次,把這兩個數找出來。

很簡單,根據所有數的異或結果,將數字分為兩組,然後找出這兩個數。前面我的blog裡有這個題的介紹的。

第四題、把乙個鍊錶逆過來,要求空間複雜度o(1),這個算簡單的。

[cpp]view plain

copy

/**************************=

功能:鍊錶逆序

(鍊錶的頭變成鍊錶的尾,鍊錶的尾變成頭)

返回:指向煉表表頭的指標

*************************=

*/struct

node *reverse (

struct

node *head)  

head = p1;  

return

head;  

}  二面:

1、是如何統計**行數以及注釋的行數,並寫出具體的實現**。

**行數是按照\n數的,行注釋//需要注意//...\n算乙個注釋,但注意//...\n之間的//與/**/不算注釋。

/**/要注意/* /* */ 等於乙個注釋, 也就是一旦遇見/*之後就要記下來,一直匹配到*/才算乙個完整的注釋,中間的內容隨便它是什麼,包括//可能也巢狀在其中。

2、要求用最快的速度求兩個陣列的交集,提示陣列中的元素是無序的。寫出具體的實現**。

如果雜湊真的是o(1)的,那麼可以達到o(n+m),否則就是nlogn + mlogm。

3、寫程式,將乙個浮點數轉化為字串。。

先將浮點數賦值給乙個int型別的整數,然後分別將整數部分、小數部分轉化為字串就可以了。

4、下面兩個printf的輸出結果是什麼?為什麼會有這樣的結果?

[cpp]view plain

copy

intmain(

void

)    

輸出結果是:1               -1

第乙個輸出的是字元型別占用的記憶體大小,乙個字元型別占用乙個位元組的大小,所以輸出1

由於255的二進位制表示是1111 1111,將其作為int型別輸出的時候,由於最高位是1,表示的是乙個負數,其表示的數字就是將最高位後面的7個1取反後在加上1,表示的就是-1,所以第二個輸出應該是-1。

5、下面**的輸出是什麼?

[cpp]view plain

copy

char

*c = ;  

char

**cp = ;  

char

***cpp = cp;  

intmain(

void

)    

c是乙個指標陣列,乙個陣列,元素是char*型別的指標,值分別是那些字串(的首位址)

c[0] = "enter"

c[1] = "new"

c[2] = "point"

c[3] = "first"

而和*是本質一樣的運算,即c[i]=*(c+i)

c和c+i都是char *型別,它可以退化成char **型別,再看cp,它正好是乙個char **的陣列,來看它的值:

cp[0] = c + 3

cp[1] = c + 2

cp[2] = c + 1

cp[3] = c

再引用一次看得清楚些

cp[0][0]=c[3]="first",etc

cp是char **型別,它可以退化成char ***型別,看最後的cpp,它正是char ***型別,它是乙個指標變數,和上面兩個不同,上面兩個是陣列。

1、printf("%s",**++cpp); 

++cpp 的值是cp+1,引用一次後是cp[1]再引用是*cp[1]=c[2]="point",第一句的輸出

2、printf("%s",*--*++cpp+3); 

再++cpp 的值是cp+2,引用一次是cp[2]=c+1,再對這進行--,減後是c再引用是c[0]="enter"再+3,字串指標指到"er",輸出是"er"

3、printf("%s",*cpp[-2]+3); 

這時cpp的值是cp+2,cpp[-2]=*(cpp-2)=*(cp+2-2)=cp[0]=c+3,再引用是c[3]="first",+3 字串指標指到"st",輸出是"st"

4、printf("%s\n",cpp[-1][-1]+1); 

cpp還是cp+2,cpp[-1]=*(cpp-1)=*(cp+2-1)=cp[1]=c+2,再[-1]得*(c+2-1)=c[1]="new",+1字串指標指到"ew",輸出是"ew"

三面:1、給定兩個排好序的陣列a和b,他們中的元素個數都是n,求他們所有元素的中位數。要求:時間複雜度為o(logn),空間複雜度為o(1)。(二分查詢)

實現**

2、有兩個陣列a、b,大小都為n,陣列中元素的值是整數型別、無序;要求:通過交換a,b中的元素,使陣列a元素的和與陣列b元素的和之間的差最小?

3、對已排好序的陣列a,一般來說可用二分查詢可以很快找到。現有一特殊陣列a,它是迴圈遞增的,如a=,

試在這樣的陣列中找一元素x,看看是否存在。

請寫出你的演算法,必要時可寫偽**,並分析其空間、時間複雜度。

實現**

2012百度實習生招聘面試題

一面 第一題 任意給乙個數,試證明這個數的某個倍數的十進位制表示是01串,比如3的倍數111是二進位制表示,5的倍數10是二進位制表示,等等。假設序列1,11,111,1111 用a1 an標識,下腳標n即為1的個數,如 a1 1,a2 11,a3 111 其中沒有乙個是n的倍數,即ak mod n...

2012 百度實習生面試題

一面 第一題 任意給乙個數,試證明這個數的某個倍數的十進位制表示是01串,比如3的倍數111是二進位制表示,5的倍數10是二進位制表示,等等。第二題 證明素數有無窮多個。第三題 給乙個很大的陣列,裡面有兩個數隻出現過一次,其他數都出現過兩次,把這兩個數找出來。void getnum int a,in...

百度2011實習生招聘筆試題

一 簡答題 1 extern c 是什麼意思,作用是什麼?2 至少說出兩個設計模式,闡述內容及其適用情況,最好有偽 3 tcp ip中的time wait是什麼意思?在什麼情況下會出現,簡述其好處和壞處。二 演算法與程式設計 1 某系統每天要執行n個任務 n 1000 任務之間存在複雜的依賴關係,如...