第一部分 單選題(前10題,每題2分;後10題,每題3分;共50分。選對得滿分,選錯倒扣一分,不選得0分。)html
一、字符串」alibaba」有___個不一樣的排列。node
A.5040 B. 840 C. 14 D.420程序員
答案:Dweb
解析:面試
二、下列一段C++代碼的輸出是 。算法
classBase數據庫
{編程
public:數組
intBar(char x) {return (int)(x);}緩存
virtualint Bar(int x) {return(2*x);}
};
classDerived :public Base
{
public:
intBar(char x) {return(int)(-x);}
intBar(int x) {return (x/2);}
};
voidmain(void)
{
DerivedObj;
Base*pObj=&Obj;
printf(「%d,」,pObj->Bar((char)(100)));
printf(「%d,」,pObj->Bar(100));
}
A.100,50 B. -100,200 C. -100,50D. 100,200
參考答案:A。考察C++中虛函數的知識點。
#include <stdio.h>
class A { public: void fn() { printf("fn in A\n"); } virtual void v_fn() { printf("virtual fn in A\n"); } }; class B : public A { public: void fn() { printf("fn in B\n"); } virtual void v_fn() { printf("virtual fn in B\n"); } }; int main() { A *a = new B(); a->fn(); a->v_fn(); return 0; }
基類A有兩個成員函數fn和v_fn,派生類B繼承自基類A,一樣實現了兩個函數,而後在main函數中用A的指針指向B的實例(向上轉型,也是實現多態的必要手段),而後分別調用fn和v_fn函數。結果是「fn in A"和"virtual fn in B"。這是由於fn是普通成員函數,它是經過類A的指針調用的,因此在編譯的時候就肯定了調用A的fn函數。而v_fn是虛函數,編譯時不能肯定,而是在運行時再經過一些機制來調用指針所指向的實例(B的實例)中的v_fn函數。假如派生類B中沒有實現(徹底同樣,不是重載)v_fn這個函數,那麼依然會調用基類類A中的v_fn;若是它實現了,就能夠說派生類B覆蓋了基類A中的v_fn這個虛函數。這就是虛函數的表現和使用,只有經過虛函數,才能實現面嚮對象語言中的多態性。
三、有一個二維數組A[10][5],每一個數據元素佔1個字節,且A[0][0]的存儲地址是1000,則A[i][j]的地址是 。
A.1000+10i+j B. 1000+i+j C. 1000+5i+j D. 1000+10i+5j
答案:C
四、下列__不是線性表?
A.隊列 B. 棧 C. 關聯數組 D. 鏈表
答案:C
5.下列有關在一個處理器(processor)上跑兩個線程(thread)的說法中,正確的是 。
A.一個線程能夠改變另外一個線程的程序計數器(program counter)
B.一個線程既不能讀也不能寫另外一個線程的棧(stack)
C.一個線程能夠讀寫另外一個線程的寄存器(register)
D.以上都不對
答案:B。一個進程中的全部線程共享該進程的地址空間,但它們有各自獨立的棧。
六、關於雙鏈表的搜索給定元素操做的說法正確的是 。
A.從兩個方向搜索雙鏈表,比從一個方向搜索雙鏈表的速度慢
B.從兩個方向搜索雙鏈表,比從一個方向搜索雙鏈表的方差要小
C.從兩個方向搜索雙鏈表,比從一個方向搜索雙鏈錶速度要快
D.以上說法都不正確
答案:B。
七、對n個數字進行排序,期中兩兩不一樣的數字的個數爲k,n遠遠大於k,而n的取值區間長度超過了內存的大小,時間複雜度最小能夠是 。
A.O(nlogk) B. O(nk) C. O(n) D. O(nlogn)
答案:C。
解析:n遠大於k的意思是,大多數數字都是重複的。申請2k個元素的內存,2個一對,一個存數字,一個用於計數,遍歷n個數,進行計數,該過程的時間複雜度爲O(n)。對k個數進行排序的最小時間複雜度爲O(klogk),有多種排序方法。因此總的排序時間爲:O(n)+O(klogk),而n遠大於k,因此時間複雜度爲O(n)。
八、一臺指針式鐘錶的時鐘和分鐘的指向重合的時間間隔是__。
A.720/13分鐘 B. 720/11分鐘 C. 60分鐘D. 以上都不正確
答案:B
【分析】時針60分鐘走1/12*2π的弧度,V(時針)= 1/12*2π/60 (rad/min);分針60分鐘走2π的弧度,V(分針)= 2π/60 (rad/min);假設從重合開始通過了T時間又重合了,則知足:V(時針)*T+2π=V(分針)*T。
九、兩個大小不一樣的杯子R和S,R中裝着必定量的小米,S中裝着必定量的沙子。一名兒童用勺子從S中取出一勺沙子放入R,與小米混合以後,再從R中取出等體積的一勺混合物放入S。假定兩勺物品的體積相等,且R和S都沒有發生溢出。則如下說法中正確的是。
A.R中的沙子和S中的小米同樣多
B.R中的沙子比S中的小米少
C.R中的沙子比S中的小米多
D.沒法判斷
答案:A。
解析:假定一勺的量是x, 開始從S轉入x份的沙子放入R,此時R中有x的沙子.而後從R中轉出x份的混合物, 假定混合物由a份小米, b份沙子組成, a+b = x,這時R中剩下x-b的沙子, S裏多了a的小米, 而a = x - b.因此A是對的.
十、假定拋出的硬幣落地以後正反兩面出現的機率分別是1/2。那麼拋10次和100次硬幣(分別稱爲T10和T100)相比,如下說法正確的是 。
A.T100出現一半的正面比T10出現一半正面的機率更大
B.T100前3次都是正面的機率比T10前3次都是正面的可能性大
C.T100正面次數的方差小於T10出現正面次數的方差
D.T100出現正面的比例比T10出現正面的比例在(0.45,0.55)區間中的可能性更大。
答案:D。測試的次數越多,出現正面的機率越趨近於50%。
十一、某福彩機構推出了一款簡單的猜謎遊戲:遊戲玩家只需交納n元,賭紅或者黑。若是開獎結果與遊戲玩家所賭的顏色相同,則玩家除獲得交納的n元賭資外,還能夠得到n元做爲獎勵;不然該玩家失去交納的n元賭資。爲了遊戲公平,開獎是紅或者黑的機率均爲1/2。某遊戲玩家想出了一個玩法:開始出100元參與賭博,而後按照以下規則進行遊戲,若是輸掉,而且賭資充足,就把已經輸了的總錢數翻倍做爲賭資進行賭博;不然,就中止該遊戲。假定該機構賭資無限,而玩家的賭資比較有限,如下關於該玩家退出遊戲時的情形的評論中合理的是: 。
A.該玩家的策略能夠保證遊戲結束時贏錢數的指望爲正數
B.該福彩機構長期會賠錢
C.該玩家會有必定機率在遊戲結束時輸錢,但輸得很少
D.該玩家贏的可能性比輸的可能性大
答案:C
【分析】若是賭徒有無窮多的錢,他和莊家的贏錢指望是相同的。可是他有可能輸光錢。
十二、有16瓶水,其中只有一瓶水有毒,小白鼠喝一滴以後一小時會死。請問最少用__只小白鼠,在1小時內必定能夠找出至少14瓶無毒的水?
A.1只
B.3只
C.4只
D.16只
答案:B。將16瓶水兩兩分紅A1-A8共8組,有b1-b3三隻白鼠。b1-b3分別喝以下組:
b1:A一、A四、A五、A7;b2:A二、A四、A六、A7;b1:A三、A五、A六、A7。
由於例如b1死,b二、b3活,則說明A1中有一瓶毒水,其他7組都無毒;b一、b2死,b3活,則說明A4中有一瓶毒水,其他7組都無毒。
所以3只足矣。
1三、有一臺4核CPU的服務器,上面運行着1種在線服務。若是該在線服務處理一個請求在非獨佔IO上的等待時間和CPU計算上消耗的時間比爲2:1,假定IO帶寬充足,那麼至少開 個線程能最大化性能地使用該服務器?
A.4 B. 8 C. 12 D. 線程越多越好
答案;C。
【分析】單核狀況下,依據題意,該任務的一個線程的CPU執行和I/O等待週期爲1:2,因此同時併發3個線程,能夠隨時有一個線程在使用CPU,從而使CPU的使用率最大。那麼,4核就應該是12個線程。關於CPU調度,詳見:http://blog.sina.com.cn/s/blog_630c97f20100vhc9.html
1四、有一種語言稱爲lua,裏面的數字只有一種類型(number),其實是雙精度浮點數。沒有各類位數的整數,如32位、64位整數等。那麼關於該語言的說法錯誤的是 。
A.該語言能夠用number類型的變量做爲數組下標
B.該語言能夠表示任意32位數字整數的數字ID
C.該語言沒法實現32位數字整數的按位與、或、異或運算
D.該語言能夠正常進行雙精度浮點數運算
答案:B
【分析】貼來的答案:A 能夠用number類型的變量做爲數組下標
毫無疑問是正確的。
錯誤的是B。
B 該語言能夠表示任意32爲整數的數組ID
緣由是由於:
lua的基本類型number,其實就是用float表示的。 所謂的整數,其實也是用float去表示的, 如lua中的整數100,其實是float類型100.0,因此lua不能表示32位整數的數組ID,自己沒有那麼大。
關於C選項:
C 該語言沒法實現32爲數字整數的按位與、或、異或運算
在最基本的庫文件裏確實沒有內置的算法,可是在擴展庫中仍是存在的好比
require"bit"
bit.band(6,4)
bit.rshift(6,1)
bit.bor(6,4)
bit.bnot(6)
D 該語言能夠正常進行雙精度浮點數運算:
這個應該是對的,由於lua int的內部實現就是經過double實現的。
1五、一個在線服務一般須要讀取存儲着海量數據的數據庫。爲了提升服務的處理速度,一般須要加cache(緩存)。如下場景中不合適使用cache的是 。
A.數據庫中每條數據被訪問到的機率近似相等,且獨立
B.使用了多線程機制的服務
C.單條數據尺寸大小的數據
D.有着大量訪問的服務
答案:A。若是每條數據被訪問到的機率近似相等,那麼緩存的意義不大。由於緩存的每每是訪問頻率比較高的數據。
16 以下一段神奇的代碼實現的功能是 。
int miracle(unsigned int n)
{
int m=n==0 ? 0:1;
while(n=(n&(n-1)))
{
m++;
}
return m;
}
A.n的二進制表示中」0″的個數
B.n的二進制表示的倒序值
C.n的二進制表示中」1″的個數
D.一個均勻的哈希函數
參考答案:C。
【分析】C++中while(表達式),表達式類型轉換爲邏輯真假,只要表達式不等於0,表達式值爲轉換爲邏輯真,循環條件便知足,執行循環體。這和JAVA不同,JAVA中while(true)才執行循環體。謹記!
1七、有1023個兩兩不一樣的整數,取值範圍是1到1024,其按位異或的結果的取值範圍是。
A.0到1024
B.0,1025到2047
C.1到1024
D.2到2048以前的所有偶數
答案:C。2^3=1,只有當兩個數相等時其異或的值才爲0,因此A、B、D都被排除,因此選擇C。
1八、七夕節n對戀人(n>=2)圍成一圈舉行篝火晚會。晚會的規則是:男女相間隔,且每對戀人處在相鄰的位置上。請問有多少種不一樣的圈子?
A.(2n-1)!/2 B. 2(n-1)! C. 2^n*(n-1)! D. (2n)!
答案:B。
【分析】經典的圈排列問題:n對人有(n-1)!種圓圈排列。每一對男女的位置能夠調換,因此乘以2^n,但因爲男女相間隔,因此只能乘以2。
1九、星期天有10個朋友約好一塊兒郊遊,在車站的集合時間是早晨9:50:00到10:00:00。已知每一個人到達車站的時間是9:50:00到10:00:00內的均勻分佈,且彼此獨立。那麼最後一人最可能到達的時間是 (精確到分鐘,向下取整)。
A.各個分鐘機率相等 B. 9:57 C. 9:58 D. 9:59
答案:D
20、已知某國家每一年出生人口數每一年遞增3%,且男女比例爲1:1。若是每一個男性都但願找比本身小0.5到 3歲的女性結婚,且每一個女性都但願找比本身大0.5到3歲的男性結婚,適婚年齡爲20到30歲,那麼對該國適婚男女婚配方面的說法正確的是 。
A.男女會比較均衡
B.會產生較多剩女
C.會產生較多剩男
D.信息不足,沒法判斷
答案:A。生男生女機率相同,且基數相等,因此有多少剩男就會有多少剩女。所以,男女會比較均衡。
第二部分 不定向選項(4題,每題5分。每題有1-5個正確選項,徹底正確計5分,漏選計2分,不選計0分,多選、錯選計-2分)
2一、要提升多線程程序的效率,對鎖的控制策略很是重要。一種策略是在鎖的個數不太多、控制結構不太複雜的狀況下,儘量下降加鎖的粒度;另外一種策略是在合適的條件下取消用鎖。如下狀況中不可能取消鎖的是 。
A.多線程寫一個共同的數據結構,且寫操做是原子操做
B.多線程寫一個共同的數據結構,且寫操做不是原子操做
C.多線程讀一個共同的數據結構,且讀操做不是原子操做
D.一個線程寫,多個線程讀一個共同的數據結構,寫操做是原子操做,讀操做不是原子操做
E.一個線程寫、多個線程讀一個共同的數據結構,寫操做不是原子操做,讀操做是原子操做
答案:BE。該題考察的是多線程鎖機制以及原子操做的概念。
解析:"原子操做(atomic operation)是不須要synchronized",這是Java多線程編程的老生常談了。所謂原子操做是指不會被線程調度機制打斷的操做;這種操做一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另外一個線程)。
2二、一顆非空的二叉樹的先序遍歷序列與後序遍歷序列正好相反,則該二叉樹多是 。
A.全部的結點均無右孩子
B.只有一個葉子結點
C.是一顆二叉樹索樹
D.全部的結點均無左孩子
答案:ABD。
2三、如下數字在表示爲double(8字節的雙精度浮點數)時存在舍入偏差的有 。
A. B. 10的30次方 C. 0.1 D. 0.5 E. 100
【答案】AB。由於是無限循環小數,存入必存在偏差;10的30次方超出了double表示的範圍,因此也存在偏差。
2四、給定以下C程序:
typedef struct node_s{
int item;
struc tnode_s* next;
}node_t;
void reverse_list(node_t* head)
{
node_t *n=head;
head=NULL;
while(n){
}
return head;
}
如下哪項能實現該函數的功能
A.node_t* m=head; head=n; head->next=m; n=n->next;
B.node_t* m=n; n=n->next; m->next=head; head=m;
C.node_t* m=n->next; n->next=head; n=m; head=n;
D.head=n->next; head->next=n; n=n->next;
參考答案:D。函數的功能是實現指針反轉。
第三部分 填空與問答(5題,共30分)
2五、(4分)某無聊的程序員在玩Windows上的記事本程序,不用鼠標,每次能夠按如下鍵或組合之一:A、Ctrl+A(全選)、Ctrl+C(拷貝)、Ctrl+V(粘貼),那麼在10次按鍵只能能夠製造的最長文本長度爲_20_ 。
參考答案:"AAAAA"+"Ctrl+A"+"Ctrl+C"+"Ctrl+V"+"Ctrl+V"+"Ctrl+V"。因此最長文本長度爲20。
2六、(4分)若初始序列爲gbfcdae,那麼至少須要 次兩兩交換,才能使該序列變爲abcdefg。任給一個自由a–g這7個字母組成的排列,最壞的狀況下須要至少_6_次兩兩交換,才能使序列變爲abcdefg。
解析::每次交換能夠把一個字符放在正確的位置,當前面的都放好後,最後一個自動放好。
27. (5分)在某惡劣天氣,若地圖上S點(左上角)到T點(右下角)的交通網以下圖所示,其中每條邊表示一條雙向通道,其上的數字爲該通路可通行的機率,且該機率兩兩獨立。求S到T的可通行機率 _1/2_。
解析:SCT+SBT+SABT = 1/2。
28.(8分)6度分離假說的含義是,世界上任何兩我的要麼是朋友,要麼是朋友的朋友,或者更高階的朋友的朋友(如朋友的朋友的朋友),改論斷中」朋友」一詞出現的次數爲兩人之間的距離,那麼該距離小於等於6。若是某SNS(如QQ、旺旺等),有100萬用戶,其人際關係網咯符合如下兩個假設:
朋友關係是一種對稱關係(如A和B是朋友,那麼B和A也是朋友)
符合2度分離假說
第i我的擁有的朋友的個數爲ni ,全部ni 中最大值爲n
試估算n的最小值 。
29.(9分)某電子商務網站進行A、B兩種推薦算法的效果對比測試,對用戶的訪問請求按照1:9的比例隨機分配給A和B兩種算法處理。產生推薦結果後,按照兩種指標對比兩種算法產生的結果好壞:第一種指標是CTRPV=該算法下用戶的點擊展示次數/該算法下全部的展示次數,第二種指標是CTRUV=該算法下有點擊的用戶數/該算法下全部的用戶數。假定每一個用戶會對該推薦服務2次訪問,若是A和B的CTRPV持平(假設爲0.01)。那麼CTRUV哪一個大,大的比小的大百分之多少。
第四部分:JAVA附加題(注,阿里有大量JAVA研發工程師需求;選做如下題目有機會增長該方向面試機會)
30.如下每一個線程輸出的結果是什麼?(不用關注輸出的順序,只需寫出輸出的結果集便可)
public class TestThread { public static void main(String[] args) { Thread t1 = new Thread() { public void run() { try { int i = 0; while (i++ < 100000) { // nothing } System.out.println("A1"); } catch (Exception e) { System.out.println("B1"); } }; }; t1.start(); t1.interrupt(); // test2 Thread t2 = new Thread() { public void run() { try { Thread.sleep(5000); System.out.println("A2"); } catch (Exception e) { System.out.println("B2"); } }; }; t2.start(); t2.interrupt(); // test3 Thread t3 = new Thread() { public void run() { try { Thread.sleep(50000); System.out.println("A3"); } catch (Exception e) { System.out.println("B3"); } }; }; t3.start(); t3.interrupt(); // test4 Thread t4 = new Thread() { public void run() { try { Thread.sleep(50000); System.out.println("A4"); } catch (Exception e) { System.out.println("B4"); } }; }; t4.start(); t4.interrupt(); // test5 try { t4.start(); System.out.println("A5"); } catch (Exception e) { System.out.println("B5"); } } }
參考答案:
B2
B5
B4
B3
A1
解析:
Thread.interrupt()方法不會中斷一個正在運行的線程。它的做用是,在線程受到阻塞時拋出一箇中斷信號,這樣線程就得以退出阻塞的狀態。更確切的說,若是線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那麼,它將接收到一箇中斷異常(InterruptedException),從而提前地終結被阻塞狀態。
interrupt方法並非強制終止線程,它只能設置線程的interrupted狀態,而在線程中通常使用一下方式: while (!Thread.currentThread().isInterrupted() && more work to do){},而被block的線程(sleep() or join())在被調用interrupt時會產生InterruptException,此時是否終止線程由本線程本身決定。詳見:http://blog.sina.com.cn/s/blog_6ca570ed01016mti.html
31.一個有10億條記錄的文本文件,已按照關鍵字排好序存儲,設計算法,能夠快速的從文件中查找指定關鍵字的記錄
答案:
能夠創建B樹索引。10億在 G量級, 分紅100份, 爲10M量級, 基本上放入內存無壓力了.
在這10億記錄中, 均分爲100份, 把每份的第一條記錄關鍵字和此記錄對應的文件偏移量先掃入內存(相似索引), 這裏須要磁盤隨機io 100次。這樣能夠立刻定位出指定關鍵字所在的記錄塊, 把相應的記錄塊拿到內存, 二分查找便可。
【系統工程師】 附加題
一、在互聯網時代系統的穩定性要求愈來愈高,爲了提高系統的穩定性,高可用技術被普遍運用,請列舉至少4中相關的技術解決硬件、系統或網絡等層面的單點問題。
二、請描述一下TCP創建鏈接三次握手的過程。
3.搜索引擎是很經常使用的web應用。大部分搜索引擎須要設計一個抓蟲(Crawler),從不少網站抓去網頁,分析數據,供搜索引擎使用。設想你來作一個搜索引擎的爬蟲,須要抓去約一百萬家網站的網頁內容。
1) 請畫出一個抓蟲系統的架構圖。
2) 重點說明你的爬蟲須要如何優化來提高性能。