十月下旬騰訊,網易遊戲,百度最新校園招聘筆試題集錦
引言
筆試啊,筆試,面試啊,面試,找工作啊,找工作。此文十月百度,阿里巴巴,迅雷搜狗最新面試十一題已經整理了最新的面試題70道,本文依次整理騰訊,網易遊戲,百度等各大公司最新校園招聘的筆試題,後續將繼續整理十月下旬的筆/面試題。
騰訊2011.10.15校園招聘會筆試題
1、下面的排序算法中,初始數據集的排列順序對算法的性能無影響的是(B)
A、插入排序 B、堆排序 C、冒泡排序 D、快速排序
2、以下關於Cache的敘述中,正確的是(B)
A、CPU中的Cache容量應大於CPU之外的Cache容量
B、Cache的設計思想是在合理成本下提高命中率
C、Cache的設計目標是容量儘可能與主存容量相等
D、在容量確定的情況下,替換算法的時間複雜度是影響Cache命中率的關鍵因素
3、數據存儲在磁盤上的排列方式會影響I/O服務的性能,一個圓環的磁道上有10個物理塊,10個數據記錄R1------R10存放在這個磁道上,記錄的安排順序如下表所示:
物理塊 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
邏輯記錄 |
R1 |
R2 |
R3 |
R4 |
R5 |
R6 |
R7 |
R8 |
R9 |
R10 |
假設磁盤的旋轉速度爲20ms/周,磁盤當前處在R1的開頭處,若系統順序掃描後將數據放入單緩衝區內,處理數據的時間爲4ms(然後再讀取下個記錄),則處理這10個記錄的最長時間爲(C)
A、180ms B、200ms C、204ms D、220ms
4、隨着IP網絡的發展,爲了節省可分配的註冊IP地址,有一些地址被拿出來用於私有IP地址,以下不屬於私有IP地址範圍的是(C)(私網IP地址:10.0.0.0- 10.255.255.255 ;172.16.0.0 - 172.31.255.255;192.168.0.0-192.168.255.255。故選C)
A、10.6.207.84 B、172.23.30.28 C、172.32.50.80 D、192.168.1.100
5、下列關於一個類的靜態成員的描述中,不正確的是(D)
A、該類的對象共享其靜態成員變量的值 B、靜態成員變量可被該類的所有方法訪問
C、該類的靜態方法只能訪問該類的靜態成員變量 D、該類的靜態數據成員變量的值不可修改
6、已知一個線性表(38,25,74,63,52,48),假定採用散列函數h(key) = key%7計算散列地址,並散列存儲在散列表A【0....6】中,若採用線性探測方法解決衝突,則在該散列表上進行等概率成功查找的平均查找長度爲(C)
A、1.5 B、1.7 C、2.0 D、2.3
依次進行取模運算求出哈希地址:
A |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
記錄 |
63 |
48 |
|
38 |
25 |
74 |
52 |
查找次數 |
1 |
3 |
|
1 |
1 |
2 |
4 |
74應該放在下標爲4的位置,由於25已經放在這個地方,所以74往後移動,放在了下標爲5的位置上了。
由於是等概率查找,所以結果爲:1/6*(1+3+1+1+2+4)= 2.0
7、表達式“X=A+B*(C--D)/E”的後綴表示形式可以爲(C)
A、XAB+CDE/-*= B、XA+BC-DE/*= C、XABCD-*E/+= D、XABCDE+*/=
8、(B)設計模式將抽象部分與它的實現部分相分離。
A、Singleton(單例) B、 Bridge(橋接)
C、 Composite(組合) D、 Facade(外觀)
9、下面程序的輸出結果爲多少?
- void Func(char str_arg[100])
- {
- printf("%d\n",sizeof(str_arg));
- }
- int main(void)
- {
- char str[]="Hello";
- printf("%d\n",sizeof(str));
- printf("%d\n",strlen(str));
- char *p = str;
- printf("%d\n",sizeof(p));
- Func(str);
- }
輸出結果爲:6 5 4 4
對字符串進行sizeof操作的時候,會把字符串的結束符“\0”計算進去的,進行strlen操作求字符串的長度的時候,不計算\0的。
數組作爲函數參數傳遞的時候,已經退化爲指針了,Func函數的參數str_arg只是表示一個指針,那個100不起任何作用的。
10、下面程序的輸出結果爲多少?
- void Func(char str_arg[2])
- {
- int m = sizeof(str_arg); //指針的大小爲4
- int n = strlen(str_arg); //對數組求長度,str_arg後面的那個2沒有任何意義,數組已經退化爲指針了
- printf("%d\n",m);
- printf("%d\n",n);
- }
- int main(void)
- {
- char str[]="Hello";
- Func(str);
- }
輸出結果爲: 4 5
strlen只是對傳遞給Func函數的那個字符串求長度,跟str_arg中的那個2是沒有任何關係的,即使把2改爲200也是不影響輸出結果的。。
11、到商店裏買200的商品返還100優惠券(可以在本商店代替現金)。請問實際上折扣是多少?
算法編程題:
1、給定一個字符串,求出其最長的重複子串。
思路:使用後綴數組,對一個字符串生成相應的後綴數組後,然後再排序,排完序依次檢測相鄰的兩個字符串的開頭公共部分。
這樣的時間複雜度爲:
生成後綴數組 O(N)
排序 O(NlogN*N) 最後面的 N 是因爲字符串比較也是 O(N)
依次檢測相鄰的兩個字符串 O(N * N)
總的時間複雜度是 O(N^2*logN),
1、對於一個內存地址是32位、內存頁是8KB的系統。0X0005F123這個地址的頁號與頁內偏移分別是多少。
2、如果X大於0並小於65536,用移位法計算X乘以255的值爲:-X+X<<8
X<<8-X是不對的,X<<8,已經把X的值改變了(訂正:X<<8是個臨時變量,不會改變X的值,就像a+1不會改變a一樣)。
3、一個包含n個節點的四叉樹,每個節點都有四個指向孩子節點的指針,這4n個指針中有 3n+1 個空指針。
4、以下兩個語句的區別是:
- int *p1 = new int[10];
- int *p2 = new int[10]();
5、計算機在內存中存儲數據時使用了大、小端模式,請分別寫出A=0X123456在不同情況下的首字節是,大端模式:0X12 小端模式:0X56 X86結構的計算機使用 小端 模式。
一般來說,大部分用戶的操作系統(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。
6、在遊戲設計中,經常會根據不同的遊戲狀態調用不同的函數,我們可以通過函數指針來實現這一功能,請聲明一個參數爲int *,返回值爲int的函數指針:
int (*fun)(int *)
7、在一冒險遊戲裏,你見到一個寶箱,身上有N把鑰匙,其中一把可以打開寶箱,假如沒有任何提示,隨機嘗試,問:
(1)恰好第K次(1=<K<=N)打開寶箱的概率是多少。
(2)平均需要嘗試多少次。
一、算法設計
1、設rand(s,t)返回[s,t]之間的隨機小數,利用該函數在一個半徑爲R的圓內找隨機n個點,並給出時間複雜度分析。
2、爲分析用戶行爲,系統常需存儲用戶的一些query,但因query非常多,故系統不能全存,設系統每天只存m個query,現設計一個算法,對用戶請求的query進行隨機選擇m個,請給一個方案,使得每個query被抽中的概率相等,並分析之,注意:不到最後一刻,並不知用戶的總請求量。
3、C++ STL中vector的相關問題:
(1)、調用push_back時,其內部的內存分配是如何進行的?
(2)、調用clear時,內部是如何具體實現的?若想將其內存釋放,該如何操作?
二、系統設計
正常用戶端每分鐘最多發一個請求至服務端,服務端需做一個異常客戶端行爲的過濾系統,設服務器在某一刻收到客戶端A的一個請求,則1分鐘內的客戶端任何其它請求都需要被過濾,現知每一客戶端都有一個IPv6地址可作爲其ID,客戶端個數太多,以至於無法全部放到單臺服務器的內存hash表中,現需簡單設計一個系統,使用支持高效的過濾,可使用多臺機器,但要求使用的機器越少越好,請將關鍵的設計和思想用圖表和代碼表現出來。
如p([1,2,3])輸出:
[123]、[132]、[213]、[231]、[321]、[323]
求一個組合函數
如p([1,2,3])輸出:
[1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3]
迅雷2011.10.21筆試題
knuth(int n, int m)
{
srand((unsigned int)time(0));
for (int i=0; i<n; i++)
{
if ( )
{
cout<<i<<endl;
;
}
}
}
分別爲:rand()%(n-i)<m 和 m--;
2、以下prim函數的功能是分解質因數。請填空
void prim(int m, int n)
{
if (m>n)
{
while ( ) n++;
;
prim(m,n);
cout<<n<<endl;
}
}
分別爲:m%n 和 m/=n
3、下面程序的功能是輸出數組的全排列。請填空
void perm(int list[], int k, int m)
{
if ( )
{
copy(list,list+m,ostream_iterator<int>(cout," "));
cout<<endl;
return;
}
for (int i=k; i<=m; i++)
{
swap(&list[k],&list[i]);
;
swap(&list[k],&list[i]);
}
}
分別爲:k==m 和 perm(list,k+1,m)
二、主觀題:
1、(40分)用戶啓動迅雷時,服務器會以uid,login_time,logout_time的形式記錄用戶的在線時間;用戶在使用迅雷下載時,服務器會以taskid,start_time,finish_time的形式記錄任務的開始時間和結束時間。有效下載時間是指用戶在開始時間和結束時間之間的在線時間,由於用戶可能在下載的時候退出迅雷,因此有效下載時間並非finish_time 和 start_time之差。假設登錄記錄保存在login.txt中,每一行代表用戶的上下線記錄;下載記錄保存在task.txt中,每一行代表一個任務記錄,記錄的字段之間以空格分開。計算每個用戶的有效下載時間和總在線時間的比例。注意:請儘量使用STL的數據結構和算法
2、(60分)在8X8的棋盤上分佈着n個騎士,他們想約在某一個格中聚會。騎士每天可以像國際象棋中的馬那樣移動一次,可以從中間像8個方向移動(當然不能走出棋盤),請計算n個騎士的最早聚會地點和要走多少天。要求儘早聚會,且n個人走的總步數最少,先到聚會地點的騎士可以不再移動等待其他的騎士。
從鍵盤輸入n(0<n<=64),然後一次輸入n個騎士的初始位置xi,yi(0<=xi,yi<=7)。屏幕輸出以空格分隔的三個數,分別爲聚會點(x,y)以及走的天數。
盛大遊戲2011.10.22校園招聘會筆試題
1、下列代碼的輸出爲:
- #include "iostream"
- #include "vector"
- using namespace std;
- int main(void)
- {
- vector<int>array;
- array.push_back(100);
- array.push_back(300);
- array.push_back(300);
- array.push_back(500);
- vector<int>::iterator itor;
- for(itor=array.begin();itor!=array.end();itor++)
- {
- if(*itor==300)
- {
- itor = array.erase(itor);
- }
- }
- for(itor=array.begin();itor!=array.end();itor++)
- {
- cout<<*itor<<" ";
- }
- return 0;
- }
A、100 300 300 500 B、100 300 500 C、100 500 D、程序錯誤
vector在erase之後,指向下一個元素的位置,其實進行erase操作時將後面所有元素都向前移動,迭代器位置沒有移動。itor=array.erase(itor) erase返回下一個元素的地址,相當於給itor一個新值。
2、下列代碼的輸出爲:
- class CParent
- {
- public:
- virtual void Intro()
- {
- printf("I'm a Parent, ");
- Hobby();
- }
- virtual void Hobby()
- {
- printf("I like football!");
- }
- };
- class CChild:public CParent
- {
- public:
- virtual void Intro()
- {
- printf("I'm a Child, ");
- Hobby();
- }
- virtual void Hobby()
- {
- printf("I like basketball!\n");
- }
- };
- int main(void)
- {
- CChild *pChild = new CChild();
- CParent *pParent = (CParent*)pChild;
- pParent->Intro();
- return 0;
- }
A、I'm a Child,I like football! B、I'm a Child,I like basketball!
C、I'm a Parent,I like football! D、I'm a Parent,I like basketball!
3、在win32平臺下,以下哪種方式無法實現進程同步?
A、Critical Section B、Event C、Mutex D、Semaphore
4、以下哪句的說法是正確的
A、在頁式存儲管理中,用戶應將自己的程序劃分爲若干個相等的頁
B、所有的進程都掛起時,系統將陷入死鎖
C、執行系統調用可以被中斷
D、進程優先數是進程調度的重要依據,必須根據進程運行情況動態改變
5、以下描述正確的是
A、虛函數是可以內聯的,可以減少函數調用的開銷提高效率
B、類裏面可以同時存在函數名和參數都一樣的虛函數和靜態函數
C、父類的析構函數是非虛的,但是子類的析構函數是虛的,delete子類對象指針會調用父類的析構函數
D、以上都不對
簡答題:快速排序的思想是遞歸的,但是它的平均效率卻是衆多排序算法中最快的,爲什麼?請結合本例說明你對遞歸程序的理解。
算法題:用你熟悉的編程語言,設計如下功能的函數:輸入一個字符串,輸出該字符串中所有字母的全排列。程序請適當添加註釋。
C++函數原型: void Print(const char *str)
輸入樣例: abc
輸出結果: abc、acb、bca、bac、cab、cba
後續整理
- 12個工廠分佈在一條東西向高速公路的兩側,工廠距離公路最西端的距離分別是0、4、5、10、12、18、27、30、31、38、39、47.在這12個工廠中選取3個原料供應廠,使得剩餘工廠到最近的原料供應廠距離之和最短,問應該選哪三個廠 ?
-
1)、開放地址法
2)、再哈希法
3)、鏈地址法
4)、建立一個公共溢出區 - int main()
{
if()
{
printf("Hello ");
}
else
{
printf("World !!!");
}
return 0;
}
在if裏面請寫入語句 使得打印出 hello world。 - 今天10.19西山居筆試題:
分別寫一個宏和函數來獲取元素個數 如count(a) 會得到a數組元素個數 。 - 平均要取多少個(0,1)中的隨機數才能讓和超過1。(答案: e 次, 其中e是自然對數的底數)
- 今天支付寶10.20筆試題:漢諾塔一共爲 2*N,2個一樣大小,有編號順序 每次只能移動一個 大的不能疊在小得上面 移動完之後,相同大小的編號必須和原來一樣 問最小要移動多少次? 如 A1 A2 B1 B2 C1 C2 ...... 這樣疊,A<B<C.... B不能放A上面,C不能放B A上面,移動到另外一個柱子後,還必須是 A1 A2 B1 B2 C1 C2 ....
- socket編程的問題
TCP連接建立後,調用send 5次,每次發100字節,問recv最少要幾次,最多要幾次? - 迅雷筆試題:
下面的程序可以從1....n中隨機輸出m個不重複的數。請填空
knuth(int n, int m)
{
srand((unsigned int)time(0));
for (int i=0; i<n; i++)
if ( )
{
cout<<i<<endl;
( );
}
} - 四個線程t1,t2,t3,t4,向4個文件中寫入數據,t1只能寫入1,t2只能寫入2,t3只能寫入3,t4只能寫入4,對4個文件A,B,C,D寫入如下內容
A:123412341234.....
B:234123412341....
C:341234123412....
D:412341234123....
怎麼實現同步可以讓線程並行工作? - 比如一個數組[1,2,3,4,6,8,9,4,8,11,18,19,100]
前半部分是是一個遞增數組,後面一個還是遞增數組,但整個數組不是遞增數組,那麼怎麼最快的找出其中一個數? - 今日10.21迅雷筆試題: 1、一棵二叉樹節點的定義(和平時我們定義的一樣的) 它給出了一棵二叉樹的根節點 說現在懷疑這棵二叉樹有問題 其中可能存在某些節點不只有一個父親節點 現要你編寫一個函數判斷給定的二叉樹是否存在這樣的節點 存在則打印出其父親節點返回true 否則返回false
打印節點形式:
[當前節點][父親節點1][父親節點的父親節點][。。。]
[當前節點][父親節點2][父親節點的父親節點][。。。]
2、有一億個整數,請找出最大的1000個,要求時間越短越好,空間佔用越少越好 - 在頻繁使用小內存時,通常會先申請一塊大的內存,每次使用小內存時都從大內存裏取,最後大內存使用完後一次性釋放,用算法實現。
- 今天亞馬遜A卷校招筆試題:
輸入一個字符串,如何求最大重複出現的字符串呢?比如輸入ttabcftrgabcd,輸出結果爲abc,canffcancd,輸出結果爲can。 - 今天10.22盛大:刪除模式串中出現的字符,如“welcome to asted”,模式串爲“aeiou”那麼得到的字符串爲“wlcm t std",要求性能最優。
- 數組中的數分爲兩組,讓給出一個算法,使得兩個組的和的差的絕對值最小
數組中的數的取值範圍是0<x<100,元素個數也是大於0, 小於100
比如a[]={2,4,5,6,7},得出的兩組數{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0;
比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1,所以得出的兩組數分別爲{2,10}和{5,6}。 - 百度北京研發一道系統設計題,如何快速訪問ipv6地址呢?ipv6地址如何存放?
-
百度2012校招北京站筆試題系統設計:正常用戶端每分鐘最多發一個請求至服務端,服務端需做一個異常客戶端行爲的過濾系統,設服務器在某一刻收到客戶端A的一個請求,則1分鐘內的客戶端任何其它請求都需要被過濾,現知每一客戶端都有一個IPv6地址可作爲其ID,客戶端個數太多,以至於無法全部放到單臺服務器的內存hash表中,現需簡單設計一個系統,使用支持高效的過濾,可使用多臺機器,但要求使用的機器越少越好,請將關鍵的設計和思想用圖表和代碼表現出來。
- #include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"A"<<endl;}
~A(){cout<<"~A"<<endl;}
};
class B
{
public:
B(A &a):_a(a)
{
cout<<"B"<<endl;
}
~B(){cout<<"~B"<<endl;}
private:
A _a;
};
int main()
{
A a;
B b(a);
return 0;
// 構造次序和析構次序是對稱的,這種題解答都是有技巧的.
// 拷貝構造就不說了,構造過程是:
// A A B ,那麼析構必然是對稱的:B A A。
}