華為的筆試經驗

一、準備階段:
在華為面試之前,我把《軟件設計師教程》大概的複習了一遍,時間實在太緊迫了,有些概念我也只是很粗糙地掠過去。10號下午還到圖書館借了一本《程序員面試攻略》,11號下午就差不多把那本書大概地啃完。
二、筆試:
11號,收到短信通知當晚7:00在e棟筆試(只要是註冊了電子簡歷同學都有資格),考試種類分兩種:硬件和軟件,共四類題:填空,選擇,改錯,程序設計。基本上都是一些c/c++語言題,數據結構的樹的前序、中序及後序排列,計算機網絡裏的ip報文中的ttl(time to live),數據庫的操作等等;程序題有兩道,一道題是關於數據結構的,另外有一道是“字符串a插入字符串b中”。雖然都基礎,但題量太大,考試時間太短。大家都在喊沒信心。
三、面試:
第二天就有人接到通知去面試了,我們班一位同學去了,他很牛b,從第一輪到第四輪一
直很順利。我是第三天才和我們寢室另外的一位同學才接到面試通知的(不過我聽説我們這一批接到通知的筆試分數普遍都很高),當然在前三天的等待時間裏,我心情很鬱悶,我還以為我沒有慧通的面試資格了,所以一直在玩,希望有時真的是期而不遇,遇而不期阿。(其實筆試這一輪刷的人不多,大家以後沒必要像我這樣子提前就爆棄了)
我下午4:00準時到凱萊大酒店,一進去就感覺一股熱氣,大廳裏也許是因為太熱或者太緊張的緣故,每個人的臉都很紅,很紅。大概等了半個小時,我的心也跳得好厲害,我就到門口舒緩下情緒,很快一位帥哥就領我去第一輪面試了,他問我會什麼,**,這問題該怎麼答阿,然後我説我是電子科學與技術專業的,計算機基本上是靠自學的,大概他體會到自學的不易,他給我出了5道編程題,雖然很多,但基本上都不很難。(我一同專業的哥們雖然只有一道題,但卻是用c語言編桌球的運動軌跡,媽啊,對於c語言的圖像功能我都沒接觸到過阿),我的題目是:
1、1到100之間的所有素數之和;
2、隊列的實現;
3、選首領(有一羣人圍在一圈,從第一個人開始數1、2、3,數到3者退出,用循環鏈表實現)
4、字符串匹配問題(int countabc(* s) 輸入任何一串字符串,計算機其中有連續abc子字符串的個數 )
5、用數組存儲超大數的問題。
6、詢問我操作系統的進程和線程的區別
幸好這些題目在筆試前我就都已經見過了,雖然第四個題目,面試老師説我執行效率不高,但可以過得去了。哈哈,他直接通知我去進行第二輪面試了。
第二輪是資格面試,沒多大問題,就聊聊家鄉,聊聊自己的情況,這一關只要説話有分寸,一般都可以通過。第二輪面試完,就快到了晚飯的時間了,晚飯當然是慧通免費提供的,晚飯一過後,我就被一被稱作是部長的面試官叫了進去,這一關一進去他直接拿了我《軟件設計書》提問我:
1、ping命令使用的是哪種報文?
2、osi分哪幾個層,ip是在哪個層?
3、哈希表的問題
4、為什麼要採取二叉樹這種數據結構?(折半查找)
5、兩台計算機中的進程怎麼互相通信,我説通過ip唄,他説除了ip呢?我卡住了,他説你聽説過五元組嗎?我只好老老實實的回答説不知道,然後他在那裏給我解釋一通,但我還是沒搞明白,回來翻潘愛民老師的《計算機網絡書》
也沒有。這一輪雖然第5個問題我有點卡殼,但老師説我畢竟是自學,還表揚了我,説我已經很不錯了。面試完已經好晚了,華為的mm通知我第二天繼續去進行第四輪的面試。
第二天,我按時到了考試地點,這一天,明顯感覺氣氛沒有第一天的好,垂頭喪氣的好多。很快就通知我去面試了,這一輪面試的老師明顯態度比前幾輪差多了,問的問題都有點讓我透不過氣來,但終於挺了過去,最後他直接點到桌子上
的一個題目:
void main()
{
char *p;
*p=-130;
printf("%d",*p);
}

正確的答案是126,原因:-130在計算機裏面存儲形式是11111111-01111110(取反碼的形式),因為c裏面的char是8位的,所以,最高位1去掉,剩下01111110。
四、些許體會

華為的筆試經驗

面試,就是面試,不是學習,考試。你現在會多少東西固然重要,但更重要的是你得
讓面試官知道,所以面試時把你的知識表達出來是最重要的。切記!面試表達是關鍵,你
可以先把自己熟悉的整理一下,不至於面試的時候磕磕碰碰的。面試,好比下棋。把握局
面,掌握主動權是關鍵。一旦你把面試官成功引入你的領地,讓他把注意力關注在你熟悉
的領域,無暇自顧,那就盡情發揮吧,已經成功了一大半。所以從面試官拿到你的簡歷起
,就主動出擊,別給他機會.
另外,在大肆開學初,一定要把各位的專業課翻出來看看,考軟件的特別要多多看看基礎的c語言,想找到好工作一定要從骨子裏面重視起來。

篇中提及的問題的解答:

1、1到100之間的所有素數之和;

int i = 1;
int j = 0;
bool change= 1;
int sum = 0;
for (i=1; i<100; i++)
{
for (j=2; j<i; j++)
{
if(i%j==0)
{
change = 0;
break;
}
}
if(change==1)
sum +=i;
change = 1;
}
printf("%dn",sum);

2、隊列的實現;(用數組或者鏈表,定義好輸入和輸出即可)
3、選首領(有一羣人圍在一圈,從第一個人開始數1、2、3,數到3者退出,用循環鏈表實現)
n個人圍成一圈,從第一個人開始依次從1到m循環報數,當報到m的時候此人出圈,直到圈中只剩一人為止.求最後一個人的原始編號。
int yuesefu(int n,int m)
{
int i,r=0;
for (i=2;i<=n;i++) r=(r+m)%i;
return r+1;
}

4、字符串匹配問題(int countabc(* s) 輸入任何一串字符串,計算機其中有連續abc子字符串的個數)
int countabc(* s)
{
int i = 0;
int j = 0;
int num = 0;
scanf("%s",s);
int len = strlen(s);
for (i=0; i<len-3; i++)
{
j = strcmp(s+i,"abc");
if(j==0)
num++;
}

}
5、用數組存儲超大數的問題。
這是數組得一個應用,思想是我們定義一個數組,讓每一個元素得值都是從後到前以十 進製得方式存貯得,如過到了9下一位就要讓前一個元素進位為1,9變為0同時。
下面這個例子是要求一個40位的 n!的值
int data[40];//存儲40位書的整數數組
int digit;//數據位數變量
int i,j,r,k;
int n;//用户輸入值

for(i=1; i<40+1; i++)
data[i]=0;

data[0]=data[1]=1;
digit=1;

printf("enter a number :");
scanf("%d",&n);

for(i=1; i<n+1; i++)
{
for(j=1; j<digit+1; j++)
data[j]*=i;
for(j=1; j<digit+1; j++)
{
if(data[j]>10)
{
for(r=1; r<digit+1; r++)
{
if(data[digit]>10)//大於10時候位數加1
digit++;
data[r+1]+=data[r]/10;//進位增加
data[r]=data[r]%10;//去掉進位後得值
}
}
}
printf("%d! = ",i);
for(k =digit; k>0; k--)
printf("%d",data[k]);
printf("n");

}
6、詢問我操作系統的進程和線程的區別
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。進程和線程的區別,簡而言之:
一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

=========================================
1、ping命令使用的是哪種報文?
ping命令使用icmp的哪種code類型:echo reply(回顯請求報文)

2、osi分哪幾個層,ip是在哪個層?
osi:物理層、鏈路層、網絡層、傳輸層、會話層、管理層、應用層。
tcp/ip:主機網絡層、互聯層、傳輸層、應用層。ip是在互聯層
3、哈希表的問題
主要用於快速查找檢索方面
4、為什麼要採取二叉樹這種數據結構?
他折半查找,可以減少查找比較次數
5、五元組
二元組的定義:<k,r>
三元組的定義:<d,f,a>
五元組的定義:<v,o,g,m,s>
v是值的集合,o是操作的集合,g是構成名字的文法,m是存儲的集合,s是從g能構成的名字幾個到m的映射.
ip報文中的五元組(即源ip地址,源端口號,目的ip地址,目的端口,協議)。
半相關
綜上所述,網絡中用一個三元組可以在全局唯一標誌一個進程:
(協議,本地地址,本地端口號)
這樣一個三元組,叫做一個半相關(half-association),它指定連接的每半部分。