2016屆 阿裏巴巴校招研發project師C/C++筆試題--2015.08.23
選擇題牛客網地址題目1:http://www.nowcoder.com/test/255234/summary。
題目2:http://www.nowcoder.com/test/262758/summary。
題目3:http://www.nowcoder.com/test/280885/summary。
題目4:http://www.nowcoder.com/test/315791/summary。
部分選擇題例如以下:
1、假設下列的公式成立:78+78=123。則採用的是_______進制表示的。
A. 11
B. 12
C. 13
D. 14
E. 15
F. 以上都不正確
解答1:列方程:78+78=123 =》7x+8 + 7x+8=x^2+2x+3 =》 x=13
解答2:直接看個位:8+8=16,16-x=3 =》 x=13
2.、下列 java 程序輸出結果為______。
|
int i=0; Integer j = new Integer(0); System.out.println(i==j); System.out.println(j.equals(i)); |
A. true,false
B. true,true
C. false,true
D. false,false
E. 對於不同的環境結果不同
F. 程序無法運行
解答:int類型與Integer進行比較,Integer會自己主動拆箱成Int類型再比較,所以為true。
3、下列java程序的輸出結果為____。
public class Example{ String str=new String("hello"); char[]ch={‘a‘,‘b‘}; public static void main(String args[]){ Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+" and "); Sytem.out.print(ex.ch); } public void change(String str,char ch[]){ str="test ok"; ch[0]=‘c‘; } } |
A. hello and ab
B. hello and cb
C. hello and a
D. test ok and ab
E. test ok and cb
F. test ok and c
解答:change第一個函數傳遞的不是string的引用,所以不會改變值,第二個參數會退化為指針。所以改變傳入參數的值,第一個string不變為hello,第二個改變第一個字符。為cb。所以答案為B
4、有關下述Java代碼描寫敘述正確的選項是____。
public class TestClass { private static void testMethod(){ System.out.println("testMethod"); } public static void main(String[] args) { ((TestClass)null).testMethod(); } } |
A. 編譯不通過
B. 編譯通過。執行異常。報NullPointerException
C. 編譯通過,執行異常。報IllegalArgumentException
D. 編譯通過,執行異常,報NoSuchMethodException
E. 編譯通過。執行異常。報Exception
F. 執行正常,輸出testMethod
解答:testMethod方法用static修飾的,是存在方法區中的。所以能夠調用,假設把static去掉,就會報空指針異常
5、袋子中分別一疊紙幣。當中5元面值的紙幣6張。10元面值的紙幣5張,20元面值的紙幣4張,從袋子中隨意取4張紙幣,則每種面值至少取到一張的概率為____。
A. 8/91
B. 25/91
C. 48/91
D. 53/91
E. 60/91
F. 63/91
解答:C(6,2)*C(5,1)*C(4,1)+C(6,1)*C(5,2)*C(4,1)+C(6,1)*C(5,1)*C(4,2)/(C(15,4)=48/91
6、有一個扔骰子得返現的遊戲:你扔一個骰子。扔到多少就能夠得到和點數同樣的返現。比如你扔到3,能夠得到3元返現;扔到1,能夠得到1元返現。當你扔完第一次骰子,看到點數後,你須要做出例如以下選擇:
1、拿這個點數相應的返現。放棄扔第二次骰子;
2、再扔一次骰子,但此時你僅僅能拿第二次扔的點數相應的返現。
那麽,玩一輪這個遊戲的期望收益是____元。
A. 3.5
B. 3.75
C. 4
D. 4.25
E. 4.5
F. 4.75
解答:假設第一次扔的是1,那應該又一次扔,由於又一次扔大於1的概率為5/6>1/2。同理假設是2,3都應該又一次扔。假設第一次扔的是4。則不再扔,由於又一次扔大於4的概率為2/6<1/2。同理假設是5,6都不再又一次扔。
因此能夠得到概率分布例如以下:
X=1 |
X=2 |
X=3 |
X=4 |
X=5 |
X=6 |
P1=1/2*1/6 |
P2=1/2*1/6 |
P3=1/2*1/6 |
P4=1/6+1/2*1/6 |
P5=1/6+1/2*1/6 |
P6=1/6+1/2*1/6 |
解釋一下p1=1/2*1/6。
1/2表示第一次扔到1,2,3的概率。1/6表示第二次扔到1的概率,x=2,3同理
p4=1/6+1/2*1/6
1/6表示第一次扔到4的概率。1/2*1/6表示第一次扔到1,2,3第二次扔到4的概率,x=5,6同理
因此期望為1*p1+2*p2+3*p3+4*p4+5*p5+6*p6 = 4.25
7、一個長度為100的循環鏈表,指針A和指針B都指向了鏈表中的同一個節點,A以步長為1向前移動,B以步長為3向前移動。一共須要同一時候移動多少步A和B才幹再次指向同一個節點____。
A. 99
B. 100
C. 101
D. 49
E. 50
F. 51
解答:A B一快一慢,當二者差一圈時,剛好指向同一節點,3*x - x=100 =》 x=50
8、某操作系統採用分頁存儲管理方式。下圖給出了進程A的頁表結構。假設物理頁的大小為512字節,那麽進程A邏輯地址為0x0457(十六進制)的變量存放在____號物理內存頁中。
進程A頁表:
邏輯頁 物理頁
0 9
1 2
2 4
3 6
4 5
5 8
A. 9
B. 2
C. 4
D. 6
E. 8
F. 5
解答:16位邏輯地址。如果前n位為邏輯頁號,後16-n位為偏移地址。
每一頁大小為512,512=2^9,說明0x0457的後9位是頁內偏移地址。前7為為頁號。前7位為0000 010,也就是頁號為2,因此相應物理頁是4。
9、在一個100人的團隊活動中,主持人小猿亮出了一幅裙子的照片。大喊:”看出藍黑色的舉手!
“,團隊中有45人舉手,然後小猿又喊:”看出白金色的舉手!“,團隊中有40人舉手。靈巧的小猿發現,有人從未舉過手,有人舉手了兩次,兩輪舉手分出的四類人的數目恰好構成一個等差數列。請問有____人既能看出藍黑色又能看出白金色。
A. 0
B. 15
C. 30
D. 35
E. 50
F. 55
解答:x 僅藍黑色 。y 藍黑色和白色, z 僅白色。 k 均沒看到。能夠得到
x+y = 40
y+z =45
x+y+z+k =100
(x+y+z+k) – (x+y)-(y+z) = k-y=15=nd, 當中 d 表示等差數列的前後項的差,因為等差數列僅僅有 4 向,因此 n<=3,15=3*5 ,因此 n=3 , d=5 。而且等差數列必定為 k45 40 y ,因此 y=35。
註:繪圖更easy理解。
10、將1,2,3,......,99,100隨意排列成一個圈,相鄰兩數的差的絕對值求和最多為____。
A. 100
B. 198
C. 200
D. 500
E. 2500
F. 5000
解答:最大排列為100 1 99 2 98 3.....51 49 50 所以和為99+98+97+..+1+(100-50)由於是一個圈所以,100和50相接。所以等於5000。
11、已知二叉樹中有45個葉節點,有25個度為1的節點,則二叉樹的總結點數為____。
A. 112
B. 113
C. 114
D. 115
E. 116
F. 117
解答:二叉樹中n0=n2+1,所以n2=44,所以n=n0+n1+n2=44+45+25=114
12、下面函數中,和其它函數不屬於一類的是____。
A. strcpy
B. memcpy
C. snprintf
D. strcat
E. strtok
F. strncat
此題存在疑問???
13、 某單鏈表有5個元素,設單鏈表的節點結構為(data,next),5個元素的data依次為(1、2、3、4、5)。已知指針q指向節點3。指針p指向節點4,那麽以下操作能將鏈表變為data依次為(1、2、3、5)的是____。(當中temp為節點類型指針,默認指向NULL)
A. q=p->next;
B. p=q->next;
C. p->next=q->next;
D. q->next=p->next; deleteq;
E. p->data=p->next->data;p->next=p->next->next; delete p->next;
F. temp =p->next; p->next=temp->next; p->data=temp->data; deletetemp;temp=NULL;
14、在1,2,3,.....1000中。有____個數各位乘積為0。
A. 100
B. 101
C. 172
D. 181
E. 190
F. 191
解答:考慮個位為0的數。形如10,20,30...110,120...200。210,220...1000等,共1000/10=100個數。再考慮十位為0的數。101到109,共同擁有9個,101到909共81個數(九個區間,每一個區間九個數,即9 * 9 = 81);共100 + 81 = 181。
15、 A、B、C、D四人應聘一個程序猿職位,此職務的要求條件是:Java熟練;懂數據庫開發。會Web開發;有C++經驗。誰滿足的條件最多,誰就被雇用。(1)把上面四個要求條件兩兩組合,每一個組合都恰有一人滿足。同一時候已知(2)A和Bjava熟練(3)B和C會Web(4)C和D懂數據庫(5)D有C++經驗那麽,被雇用的是____。
A. A
B. B
C. C
D. D
E. 四人機會均等
F. 以上均錯
解答:
A: java sql
B:java web C++
C:web sql
D:sql C++
16、有一個單向鏈表隊列中有一個A、B兩個相鄰元素,有一個指針p指向元素A,現將一個指針r指向的S元素要插入到A和B之間。該進行操作____。
A. p->next=p->next->next
B. r->next=p;p->next=r->next
C. r->next=p->next;p->next=r
D. r=p->next;p->next=r->next
E. r->next=p;p->next=r
F. p=p->next->next
17、使用KMP算法在文本串S中找模式串P是一種常見的方法。如果S=P={xyxyyxxyx},亦即將S對自己進行匹配,匹配過程中正確的next數組是____。
A. 0,1,1,2,2,1,2,2,3
B. 0,1,2,2,3,1,2,2,3
C. 0,1,1,2,3,1,2,2,3
D. 0,1,1,2,3,1,1,2,3
E. 0,1,2,2,3,1,1,2,3
F. 0,1,2,2,2,1,1,2,3
解釋:求出 next 數組 -1 0 0 1 2 0 1 1 2 KMP 應用 next 數組時。當第 j 個元素不匹配時。模式串右移 j-next[j] 個字符(由j移到next[j]位)
當求出的 next 數組為 0 1 1 2 3 1 2 2 3 時, KMP 應用 next 數組時,當第 j 個元素不匹配時。模式串右移 j-1-next[j] 個字符。關於KMP算法能夠參考:http://blog.csdn.net/u012243115/article/details/41868933。
18、A為整數數組, N為A的數組長度,請問運行下面代碼,最壞情況下的時間復雜度為____。
void fun(int A[], int n) { for (int i = n - 1; i >= 1; i--) { for (int j = 0; j < i; j++) { if (A[j] > A[j+1]) { int tmp = A[j + 1]; A[j + 1] = A[j]; A[j] = tmp; } } } } |
A. O(N)
B. O(N^2)
C. O(Nlog(N))
D. O(log(N))
E. O(N^3)
F. 無法確定
19、牛客某程序員小楊每天接老婆下班回家。小楊在6點準時下班從公司開車出發,因為路上可能存在的堵車情況,小楊到老婆公司門口的時間點均勻的分布在6點20到6點30之間。老婆依據小楊的下班時間做了預計,到公司門口的時間點均勻的分布在6點25到6點30之間,假設小楊比老婆晚到公司門口將會挨罵,那麽小楊被罵的概率是____。
A. 1/4
B. 1/3
C. 1/2
D. 2/3
E. 3/4
F. 以上都不正確
解答:小楊時間為x坐標,20~30。老婆時間為y坐標,25~30。
四根線圍成一個矩形,矩形面積為50。
再畫根輔助線y=x。僅僅有y<x時才會挨罵,即小楊比他老婆晚。y=x與矩形相交於(25,25)(30。30),y=x下方三角形區域表示會挨罵,面積是25/2,所以挨罵概率為1/4。
20、將整數數組(7-6-3-5-4-1-2)依照堆排序的方式原地進行升序排列,請問在整個排序過程中。元素3的數組下標發生過____次改變。
A. 0
B. 1
C. 2
D. 3
E. 4
F. 5
解答:
使用大根堆排序。僅僅須要2次移動3的下標。第一次在將3升到堆頂的時候,第二次則是將3與末尾元素交換的時候,
做阿裏的題目最大的感觸就是時間根本不夠,40分鐘20個選擇題。差點兒每題至少須要2分鐘思考和計算。
附加題總共三道。例如以下:
題目一:
給出一組整數對 {(a[0], b[0]), (a[1], b[1]) ... (a[n-1], b[n-1]) }。全部 a 值 和 b 值分別不反復(隨意 i!= j 滿足 a[i] != a[j] 且 b[i] != b[j])。構造一棵 n 結點的二叉樹。將這 n 個整數對分配到各個結點上。根和全部子樹滿足下面條件:
1) 全部結點的 a 值滿足二叉查找樹的順序。即 left->a< root->a && root->a < right->a;
2) 全部結點的 b 值滿足最大堆的順序。即 root->b> left->b && root->b > right->b。
問題一:實現 build 函數。輸入 n 個整數對,返回一棵構造好的二叉樹。
struct pair_t { int a, b; }; struct node_t { int a, b; node_t *left, *right; }; node_t* build(pair_t* pair, int n);
比如,輸入是 {(5, 8), (2, 10), (4, 3), (1, 5),(0, 2), (9, 1)},輸出是下列二叉樹:
提示:1) 構造出的二叉樹的形態是存在且唯一的。
2) 想辦法確定樹根。
問題二:已知滿足上述條件的二叉樹,設計算法實現插入一個整對 (a, b)。使新的二叉樹仍滿足上述條件。該算法比較復雜。候選人僅僅需描寫敘述思路。
思路:
要求的樹是笛卡爾樹,參考百度百科:http://baike.baidu.com/link?url=FpWeU_PlLS3F5hlkk0zGHun18lUzqbx6Q56sx3ZMrqKXaz-BBKd7IFo5AUKLFR8OJpz28IhsoOUlCTzw8SKj5K。
題目二:
如果眼下有3個程序A, B和C,須要相互數據傳輸,我們須要給做一個中轉程序P。
A 讀寫的數據是經過某壓縮格式azip壓縮過的。
B 讀寫的數據須要base64編碼。
C 讀寫數據須要壓縮格式bzip壓縮後base64編碼。
如今如果已有工具函數 :
std::string azip(const std::string& input); std::string aunzip(const std::string& input); std::string base64encode(const std::string& input); std::string base64decode(const std::string& input); bool bzip(const std::string& input, std::string* output); bool bunzip(const std::string& input, std::string* output);
請給中轉程序P設計格式轉換的工具類。註意設計的通用性,比方:可能有新的角色增加。要求給做加密解密等。
題目三:
待更新……
2016屆 阿裏巴巴校招研發project師C/C++筆試題--2015.08.23