一面:
第一題、任意給乙個數,試證明這個數的某個倍數的十進位制表示是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 任務之間存在複雜的依賴關係,如...