1.1 使用c語言將乙個1g位元組的字元陣列從頭到尾全部設定為字元'a',在一台典型的當代pc上,需要花費的cpu時間的數量級最接近:
a. 0.001秒 b. 1秒 c. 100秒 d. 2小時
解答:現在機器cpu都是ghz,每次需要若干個指令,大約在1秒。
1.2 在某些極端要求效能的場合,我們需要對程式進行優化,關於優化,以下說明正確的是:
a. 將程式整個用組合語言改寫會大大提高程式效能。
b. 在優化前,可以先確定哪部分**最為耗時,然後對這部分**使用組合語言改寫,使用的彙編語句數目越少,程式就執行越快。
c. 使用組合語言雖然可能提高程式效能,但是降低了程式的可移植性和可維護性,所以應該絕對避免。
d. 適當調整彙編指令的順序,可以縮短程式執行的時間。
解答:a中,不應該將程式整個改寫,應該只改寫關鍵部分,整個改寫降低了程式的可移植性和可維護性,b,彙編語句不是數目越少越快,迴圈等
c。不應該絕對避免
1.3 對如下c語言程式在普通的x86 pc上面執行時候的輸出敘述正確的是:
#includeusinga.程式可能崩潰,也可能輸出hello worldnamespace
std;
char *f()
intmain()
b.程式可能崩潰,也可能輸出world
c.程式可能崩潰,也可能輸出hello
d.程式一定會崩潰
解答:這個程式是想返回乙個陣列的值,x是乙個陣列,是函式f()中的乙個區域性變數,在這個函式結束的時候,將會釋放掉這個陣列,而x+6只是乙個指向world的乙個位址,f()返回的就是這個位址,但是位址中的內容沒有了。
1.4 方程x1+x2+x3+x4 =30有多少滿足x1>=2,x2>=0,x3>=-5, x4>=8的整數解?
a.3276 b. 3654 c.2925 d.17550
解答:我用程式執行出來是3276,組合數學之排列組合,我們引入新的變數y1=x1-2,y2=x2,y3=x3+5,y4=x4-8,那麼方程變為:
y1+y2+y3+y4=25,則解的個數為:c(25+4-1,25)=c(28,25)=c(28,3)=3276種
1.5 乙個袋子裡裝了100個蘋果,100個香蕉,100個桔子,100個梨,如果每分鐘從裡面隨機抽取乙個水果,那麼最多過多少分鐘時間能肯定至少拿到一打相同種類的水果?(1打=12個)
a. 40 b. 12 c.24 d.45
解答:4中水果都取了11個,用時間4*11=44分鐘,再取乙個。45分鐘。。組合數學之鴿巢原理
1.6 雙敗淘汰賽與淘汰賽相仿,也是負者出局,但負一場後並未被淘汰,只是跌入負者組,在負者組再負者(即總共已負兩場)才被淘汰。現在有10個人參加雙敗淘汰賽,假設我們取消最後的勝者組冠軍vs負者組冠軍的比賽,那麼乙個需要舉行多少場比賽?
a. 16 b.17 c.18d.19e.20
解答:10個人需要進行9場產生9個第一次失敗的人,在失敗者的9個人需要8場比賽,淘汰8個人,所以需要9+8=17
10個人 5場比賽 就分為負者組5人和勝者組5人,勝者組5人需進行4場 即可確定勝者組冠軍
負責組9個人 需進行8場可確定負者組冠軍 這樣總共17場比賽。
1.7 n個節點的二叉樹,最多可以有多少層?
a. n/2 b. log(n) c. n-1 d.n
解答:每層乙個節點的二叉樹
.下面哪個序列不是上圖的拓撲排序?
a. ebfgadch b.adbdgfch c.adchebfg
d.aedbfgch
解答:(箭頭後邊的永遠別再箭頭前邊的前面)
拓撲排序方法如下:
(1)從有向圖中選擇乙個沒有前驅(即入度為0)的頂點並且輸出它.
(2)從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊.
(3)重複上述兩步,直到剩餘的網中不再存在沒有前趨的頂點為止.
在c中h應是的g後面的。
1.9假設某主機安裝了2g記憶體,在其上執行的某支援mmu的32位linux發行版中,一共執行了x,y,z三個程序,下面關於三個程式使用記憶體的方式,哪個是可行的?
a.x,y, z 的虛擬位址空間都對映到0~4g的虛擬位址上
b.x在堆上分配總大小為1gb的空間,y在堆上分配200mb,z在堆上分配500mb,並且記憶體對映訪問一共1gb的磁碟檔案。
c. x 在堆上分配1gb,y在堆上分配800mb,z在堆上分配400mb
d.以上訪問方式都是可行的
分析:mmu是記憶體管理單位這個應該是d,32位的系統會分配4g的虛擬位址,windows架構下會用2g作業系統核心位址公用,但所有操作都是在虛擬位址上進行的,至於怎麼把虛擬位址對映到實際位址是作業系統做的事,不管分配多少,只要少於4g都可以
1.10當使用tcp協議程式設計是,下列問題哪個是必須由程式設計師考慮和處理的?
a. 亂序資料報的重傳 b.資料傳輸過程中的糾錯
c.網路擁塞處理 d.發生資料的格式和應用層協議
(2.1,2.2為程式設計題,需要寫出程式實現;2.3為演算法設計題,只需要寫出演算法設計思路及關鍵步驟的偽**即可。)
2.1給定三個整數a,b,c,實現函式int median(int a, int b, int c),返回三個數的中位數。不可以使用sort,要求整數操作(比較,位執行,加減乘除等)次數盡量少。 並分析說明程式最壞和平均情況下使用的次數。
解答:用了三次比較,一次運算。
**實現:
#include using2.2給定乙個key(只含有ascii編碼的小寫英文本母),例如kof,然後對input的string(只含有ascii編碼的小寫英文本元)利用這個key排序。順序是:先按照key中的字元排序,然後對key中不包含的字元,按a-z排序;namespace
std;
int median(int a,int b,int
c)
else
if (c
else
if (c>max)
return a+b+c-min-max;
} int
main()
解答:思路:(1)用hash表的思想,先對key字和a~z重新排序,可以定義乙個26個字元的陣列,char hash[26]; 對不同的字母對應的給與排序的值,
例如key中為kof,得到的hash['k'-97]=0; hash['o'-97]=1;hash['f'-97]=2;hash['a'-97]=3;..................
(2)用快速排序(也可以是其他演算法)演算法進行排序
**實現:
#include #include2.3 乙個平行於座標軸的n*n的網格,左下角(0,0)右上角(n,n),n為非負整數,有n個平行於座標軸的矩形,每個矩形用左下角(x1,y1)右上角(x2,y2)來表示,x1,y1,x2,y2都是非負整數,現在有非常多個query,每個query會詢問乙個網格(x,y)(x+1,y+1)乙個被幾個矩形覆蓋。現在要求設計乙個演算法,使得出來每個query的時間複雜度盡可能低,在這個前提下,預處理的時間複雜度盡可能低。using
namespace
std;
void swap(char* a,char*b)
void create_hash(char* hashtable,char*key)
//先對關鍵字元排在前面
for (int i=0;i)
//對剩餘的字元進行排列
for (int i=0;i<26;i++)
} }
//快速排序
void quick_sort(char* str,int istart,int iend,char*hashtable)
char* psign=str+istart; //
將第乙個作為劃分標誌
char* pmove=str+iend; //
需要比較移動的點
char*ptemp;
while(psign!=pmove)
else
} else
else
} }
quick_sort(str,istart,psign-1-str,hashtable);
quick_sort(str,psign+1-str,iend,hashtable);
}
void sort(char* str,char*key)
intmain()
(1<=n<=1000)
谷歌2013校園招聘筆試題
1.4 小組賽,每個小組有5支隊伍,互相之間打單迴圈賽,勝一場3分,平一場1分,輸一場不得分,小組前三名出線。平分抽籤。問乙個隊最少拿幾分就有理論上的出線希望 a.1 b.2 c.3 d.4 分析 設有a b c d e 5支球隊,假設abc晉級了。如果球隊c積1分可以出現,由於是單迴圈賽,說明他4...
2011谷歌校園招聘筆試題
恢復內容開始 一 單項選擇題 1 從n個未排序的數中尋找中位數 第 n 2 大的數 平均時間複雜度最優演算法的複雜為 a.o logn b.o n c.o nlogn d.o n 2 分析 求無序陣列的中位數 中位數即是排過序後的處於陣列最中間的元素。不考慮陣列長度為偶數的情況。設集合元素個數為n。...
2010谷歌校園招聘筆試題
1 哪個表示式不能用這個匹配 a bc d?a.ad b.abcd c.abc d.abccd 2 intel x86 cpu中,哪種運算最慢 a 加b.減 c.乘d.除 3 下面程式的輸出 include using namespace std intmain else system pause ...