2012百度实习生招聘面试题
生活随笔
收集整理的這篇文章主要介紹了
2012百度实习生招聘面试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一面:
第一題、任意給一個數,試證明這個數的某個倍數的十進制表示是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),這個算簡單的。
/* ========================== 功能:鏈表逆序 (鏈表的頭變成鏈表的尾,鏈表的尾變成頭) 返回:指向鏈表表頭的指針 ========================== */ struct node *Reverse (struct node *head) {struct node *p; //臨時存儲struct node *p1; //存儲返回結果struct node *p2; //源結果節點一個一個取p1 = NULL; //開始顛倒時,已顛倒的部分為空p2 = head; //p2指向鏈表的頭節點while(p2 != NULL){p = p2->next;p2->next = p1;p1 = p2;p2 = p;}head = p1;return head; }
二面:
1、是如何統計代碼行數以及注釋的行數,并寫出具體的實現代碼。
代碼行數是按照\n數的,行注釋//需要注意//...\n算一個注釋,但注意//...\n之間的//與/**/不算注釋。
/**/要注意/* /* */ 等于一個注釋, 也就是一旦遇見/*之后就要記下來,一直匹配到*/才算一個完整的注釋,中間的內容隨便它是什么,包括//可能也嵌套在其中。
2、要求用最快的速度求兩個數組的交集,提示數組中的元素是無序的。寫出具體的實現代碼。
如果哈希真的是O(1)的,那么可以達到O(n+m),否則就是nlogn + mlogm。
3、寫程序,將一個浮點數轉化為字符串。。
先將浮點數賦值給一個int類型的整數,然后分別將整數部分、小數部分轉化為字符串就可以了。
4、下面兩個printf的輸出結果是什么?為什么會有這樣的結果?
int main(void) {char a = 255;printf("%d\n",sizeof(++a));printf("%d\n",a);return 0; } 輸出結果是:1?????????????? -1
第一個輸出的是字符類型占用的內存大小,一個字符類型占用一個字節的大小,所以輸出1
由于255的二進制表示是1111 1111,將其作為int類型輸出的時候,由于最高位是1,表示的是一個負數,其表示的數字就是將最高位后面的7個1取反后在加上1,表示的就是-1,所以第二個輸出應該是-1。
5、下面代碼的輸出是什么?
char *c[] = {"ENTER","NEW","POINT","FIRST"}; char **cp[] = { c + 3 , c + 2 , c + 1 , c}; char ***cpp = cp;int main(void) {printf("%s",**++cpp);printf("%s",*--*++cpp+3);printf("%s",*cpp[-2]+3);printf("%s\n",cpp[-1][-1]+1);return 0; }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)。(二分查找)
http://blog.csdn.net/hackbuteer1/article/details/7584838??? 實現代碼
2、有兩個數組a、b,大小都為n,數組中元素的值是整數類型、無序;要求:通過交換a,b中的元素,使數組a元素的和與數組b元素的和之間的差最小?
3、對已排好序的數組A,一般來說可用二分查找可以很快找到。現有一特殊數組A[],它是循環遞增的,如A[]={ 17 19 20 25 1 4 7 9},
試在這樣的數組中找一元素x,看看是否存在。
請寫出你的算法,必要時可寫偽代碼,并分析其空間、時間復雜度。
http://blog.csdn.net/hackbuteer1/article/details/7581596????? 實現代碼
第一題、任意給一個數,試證明這個數的某個倍數的十進制表示是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),這個算簡單的。
/* ========================== 功能:鏈表逆序 (鏈表的頭變成鏈表的尾,鏈表的尾變成頭) 返回:指向鏈表表頭的指針 ========================== */ struct node *Reverse (struct node *head) {struct node *p; //臨時存儲struct node *p1; //存儲返回結果struct node *p2; //源結果節點一個一個取p1 = NULL; //開始顛倒時,已顛倒的部分為空p2 = head; //p2指向鏈表的頭節點while(p2 != NULL){p = p2->next;p2->next = p1;p1 = p2;p2 = p;}head = p1;return head; }
二面:
1、是如何統計代碼行數以及注釋的行數,并寫出具體的實現代碼。
代碼行數是按照\n數的,行注釋//需要注意//...\n算一個注釋,但注意//...\n之間的//與/**/不算注釋。
/**/要注意/* /* */ 等于一個注釋, 也就是一旦遇見/*之后就要記下來,一直匹配到*/才算一個完整的注釋,中間的內容隨便它是什么,包括//可能也嵌套在其中。
2、要求用最快的速度求兩個數組的交集,提示數組中的元素是無序的。寫出具體的實現代碼。
如果哈希真的是O(1)的,那么可以達到O(n+m),否則就是nlogn + mlogm。
3、寫程序,將一個浮點數轉化為字符串。。
先將浮點數賦值給一個int類型的整數,然后分別將整數部分、小數部分轉化為字符串就可以了。
4、下面兩個printf的輸出結果是什么?為什么會有這樣的結果?
int main(void) {char a = 255;printf("%d\n",sizeof(++a));printf("%d\n",a);return 0; } 輸出結果是:1?????????????? -1
第一個輸出的是字符類型占用的內存大小,一個字符類型占用一個字節的大小,所以輸出1
由于255的二進制表示是1111 1111,將其作為int類型輸出的時候,由于最高位是1,表示的是一個負數,其表示的數字就是將最高位后面的7個1取反后在加上1,表示的就是-1,所以第二個輸出應該是-1。
5、下面代碼的輸出是什么?
char *c[] = {"ENTER","NEW","POINT","FIRST"}; char **cp[] = { c + 3 , c + 2 , c + 1 , c}; char ***cpp = cp;int main(void) {printf("%s",**++cpp);printf("%s",*--*++cpp+3);printf("%s",*cpp[-2]+3);printf("%s\n",cpp[-1][-1]+1);return 0; }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)。(二分查找)
http://blog.csdn.net/hackbuteer1/article/details/7584838??? 實現代碼
2、有兩個數組a、b,大小都為n,數組中元素的值是整數類型、無序;要求:通過交換a,b中的元素,使數組a元素的和與數組b元素的和之間的差最小?
3、對已排好序的數組A,一般來說可用二分查找可以很快找到。現有一特殊數組A[],它是循環遞增的,如A[]={ 17 19 20 25 1 4 7 9},
試在這樣的數組中找一元素x,看看是否存在。
請寫出你的算法,必要時可寫偽代碼,并分析其空間、時間復雜度。
http://blog.csdn.net/hackbuteer1/article/details/7581596????? 實現代碼
總結
以上是生活随笔為你收集整理的2012百度实习生招聘面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 语言的可变参数表函数的设计
- 下一篇: 2012 人民搜索 实习生招聘 笔试题