这是一段难忘的经历,也是一个惨痛的教训。虽然有点不想写,但这毕竟是自己人生中第一次面试,有不少心得体会,还是容我娓娓道来,希望对后人应聘有所帮助。
首先,初试结束后,由于上机题没发挥好,做得不是很理想,我以为自己初试就已经被刷了,便不再想面试的事,准备安心写论文了。谁知道在9月18号下午,突然收到华为面试的预通知,这让我有点喜出望外,因为我的机试成绩太水了,根本没想到自己居然还有机会参加面试(后来才知道,只要你去参加机试,华为基本上都给你一个机会参加面试,这也是华为人性化管理的一面,白高兴了一场)。之后几天里,我看了会C、C++、数据结构、操作系统和计算机网络方面的书,在网上搜了些华为面试的经验分享,准备参加人生中的第一次面试。等了四五天,还没有收到具体的面试通知,以为自己被遗忘了……直到9月24号下午,华为那儿通知我明天或后天去参加面试(经常搞这种突然“袭击”,让人防不胜防),我又手忙脚乱了一阵子,把注册简历、身份证、学生证、四六级成绩单准备了一下,再把网上下的资料过了一遍,对自己说明天的面试二分靠实力,三分靠发挥,五分靠运气,于是很早就休息了。
第二天下午3点半左右,我再次来到华为南研所N5幢,里面负责接待的人让我到一楼大礼堂耐心等待。我拿出书和复习讲义大概翻了一会,等到4点钟初头,我和一批同学去签了个到,然后面试官会按顺序一个一个喊人。我等了有大概大半个钟头,只见一个黑皮肤、个头不高、戴着眼镜、三十大几的男子叫到我的名字,我急忙收拾一下,跟着他后面来到一个大房间,里面排着一个个桌椅板凳(每个面试官和学生一对一面试),我和他在房间的一个拐角坐下。他先叫我把简历给他看,简单介绍一下自己的情况,然后问了我一个链表的插入问题,让我在草稿纸上把程序写出来,我从头文件直到最后一个函数括号都写了一遍(可能有点乱),跟他说了一下每部分的作用;之后他又问了我机试的情况,我说机试没发挥好,他就让我把第二道题写给他看(华为的人很在乎你会不会写程序,所以最好事先在草稿纸上多练练),我大概回顾了一下,又从头开始写给他看(可能程序有点长,他等得有些不耐烦,中途还冲了杯咖啡);写好后,他又问我对这个问题有没有别的解决方案,我一时半会想不出来,就用学过的算法随口应付了一下。他听了后又看了看我的简历,问我了不了解技术服务工程师的工作职责(我面试的是软件研发工程师,他问我这个说明他心里认为我不适合做软件研发,只是我当时没反应过来),又问我考研考的什么科目,对C++有多少了解,然后就笑了笑说:“算你面试通过。”。我感到有些惊喜(实际上他只是不想得罪人才这么说的,他心里对我印象估计不怎么好,可能是我写程序时磨蹭了一些,再加上没想出很好的solution,被这个笑面虎给闷了……现在觉得自己当时真的很傻,毕竟社会经验欠缺啊。),还和他握了握手,之后没休息多久,和另外一个同学被叫去做性格测试了(这是给第一次没测出来的人一次补救机会,也就是说你总共只有两次机会,如果都测不出来,前面表现的再好都等于白搭;我面试时就有一个女生,机试和技术面都挺好的,可惜栽在性格测试上,悲催了……当时一个工作人员还跟我说这个环节不刷人的,又被闷了……);我花了近四十多分钟做完后,来到休息室坐下来,随手找了本杂志翻了翻,没过五分钟一个工作人员把我叫过去,跟我说这是最后一轮面试,也就是问问你的学习情况、生活情况、你的家庭出身、你对你应聘的岗位有多少了解之类的。这一轮面试大概花了二十多分钟,总体上还是挺轻松的,他问的最多的就是我读研阶段做的项目还有我对软件研发的兴趣怎么样,最后又问我有什么想要咨询的,我问了他平常的上班作息时间以及华为对员工的考评制度,之后和他握了握手,他跟我说会在五个工作日内给我答复(又是一个笑面虎,华为的人忽悠人的能力可真强)。当时整轮面试结束后,已经晚上7点多了,跟我一起面试的有的已经在那儿吃晚饭了。我收拾东西匆忙回去了。
面试完我一开始觉得自己还有点希望进去的,不过天有不测风云,人有旦夕祸福,9月30号下午5点50分我还在实验室里采数,突然收到了被华为拒绝的鄙视短信,让我两年后再考虑参加社会应聘,我当时有点难以接受,但毕竟自己机试考得太烂了,有不少人都200多、300多甚至满分的,只能怪自己技不如人,没什么好抱怨的,谁叫今年是史上最难就业季呢?社会总有那么多不公平,竞争一年比一年激烈(跟我一起应聘的不少都是南大、东大的,看来这年头工作确实不好找),还是赶紧洗洗睡吧……
对于这次面试,虽然最终没拿到offer,但毕竟是人生中的第一次面试,这既是个惨痛的教训,更是一个宝贵的锻炼自己的机会。人生是一场马拉松,不是百米赛跑,一开始跑在前面的未必是最后的赢家。失败是成功之母,没有风雨,船帆不过是一块破布。我的总结是:
1、凡事预则立,不预则废。首先要做好充分准备,今年的考试形式可能和以往不同,要防止有大的变动(我机试时就是栽在对考试环境不熟悉的环节上,否则不会只考那点分)。
2、对于机试。没有什么窍门,多下载一些历年的考试真题,给自己规定个时间最好和考试环境一样,2小时内做完,多做做练,熟能生巧。
3、做性格测试时不要有太多的思想压力,没有绝对的好性格与坏性格,就怕你测试时一会抱着A心态去做,一会又抱着B心态去做,最后很可能会测不出来,前面的付出准备就打水漂了。
4、面试时不要紧张,遇到不会的可以委婉的跟面试官讲,但不要不懂装懂,否则他会追着你一直问下去。多看一些C/C++、数据结构和操作系统方面的书,把一些基本的算法,如排序、链表、栈、队列、进程线程之类的知识好好复习,最好在草稿纸上多写写,毕竟华为的人非常在乎你的编程能力;其次最好能对一些常见问题提出一两个别出心裁的解决方案,不要死读书,读死书(我就在这个环节上栽跟头了)。
5、不要被面试官的笑脸和“算你通过”给麻痹了,认为自己拿offer没问题了,他这么做只是不愿意得罪你,并不代表他看好你;再退一步讲,即使你整轮面试都很好,面试官给你的评价也不错,如果机试成绩不高或者人满为患的话,估计也没戏,毕竟这年头工作都不好找,高校人才资源泛滥,研究生、博士生扔在茫茫就业大军中不过是一文不值的水货;中国这地方,什么都缺,就是不缺人,你不愿意干自然有别人愿意干,没人豁着你。
6、到华为的官网上多看看华为的企业文化,以及最近几年技术终端的解决方案,再多了解任正非的企业管理语录与说过的名言,面试时套用任老爷子的话还是很有帮助的。
最后希望各位看官不要重蹈覆辙,我命苦就算了,反正我早已经习惯了命运的多舛与不幸,但愿我被华为捉弄鄙视的经历能够对大伙有所警示。俗话说积善成德,厚德载物。这辈子没有福德,就多做些善事为自己来世积些德吧。
有一个上机考试样例,与大伙分享一下:
华为公司2014届校园招聘软件类上机考试样题
南京苏州
需进行上机考试的岗位:
底层软件开发工程师、软件开发工程师、微码软件开发工程师、云计算开发工程师、DSP工程师
产品数据工程师、解决方案测试工程师、软件测试工程师、信息技术工程师、信息系统工程师(对机考要求较低)
在线考试:机考系统的内核为VS2005及JDK1.7,使用Java答题时,类名必须为“Main”;使用C/C++答题时,使用VS2005支持的数据类型和函数。
题目类型:涉及数组、链表、指针、字符串、循环、枚举、排序等等。
考试时长:2小时
考试题目:3道题(共计320分),初级题(60分)、中级题(100分)、高级题(160分)、难度递增。
各难度上机考试样题
注意:1、要先对成绩排序,求出不大于第六个学生成绩的最高分数(且为10的 倍数),而不是求平均分,并且要考虑每个人都及格的情况;
2、学生人数已定为10个,不需要另行输入,画蛇添足。
#include<iostream>
using namespace std;
int input_check(int score[],int len)
{int i,flag=1;
if(len<1)
return -1;
for(i=0;i<len;i++)
if(score[i]<0||score[i]>100)
{flag=0;break;}
return flag;
}
void bubble_sort(int a[],int len)
{int i,j;
if(len<1)
return;
for(i=0;i<len-1;i++)
for(j=0;j<len-1-i;j++)
if(a[j]<a[j+1])
{a[j]=a[j]^a[j+1];
a[j+1]=a[j]^a[j+1];
a[j]=a[j]^a[j+1];}
}
int pass_line(int score[])
{int above_60=1,grade,i;
input_check(score,10);
bubble_sort(score,10);
for(i=0;i<10;i++)
if(score[i]<60)
{above_60=0;break;}
if(above_60)
grade=60;
else
grade=(score[5]/10)*10;
return grade;
}
void main()
{int flag,score[10],i,grade;//score[10]={61,51,49,30,20,10,70,80,90,99}//score[10]={80,90,92,86,96,68,70,84,95,100}
//score[10]={38,48,59,71,52,86,28,93,68,95}//score[10]={64,50,48,38,27,89,70,71,92,100}
for(i=0;i<10;i++)
cin>>score[i];
flag=input_check(score,10);
if(flag==1)
{grade=pass_line(score);
cout<<grade<<endl;}
}
注意:1、要准确理解倍数的数学定义,例如任何正整数都是1的倍数(包括1在内),一个正整数的倍数不要忘了还有其本身;
2、要注意n的取值范围是1≤n≤65535(2^16-1).
#include<iostream>
using namespace std;
int on_off(int a)
{int b;
if(a!=0&&a!=1)
return -1;
if(a==0)
b=1;
else if(a==1)
b=0;
return b;
}
int lamp_light(unsigned int n)
{unsigned int i,j,light=0;
if(n<1||n>65535)
return -1;
unsigned int *lamp=new unsigned int[n],*index=new unsigned int[n];
for(i=0;i<n;i++)
{lamp[i]=0;
index[i]=i+1;}
for(i=0;i<n;i++)
{for(j=i;j<n;j+=index[i])
lamp[j]=on_off(lamp[j]);
}
for(i=0;i<n;i++)
light=light+lamp[i];
delete []lamp,index;
return light;
}
void main()
{unsigned int n,light;
cin>>n;
light=lamp_light(n);
if(light!=-1)
cout<<light<<endl;
}
注意:1、要注意地铁线A是环线,B是直线,且都为双向的;最好在纸上画一下,按不同的出发地与目的地分类讨论;
2、要求的是最少的车站数量,需要考虑两点之间的最短路径问题。
#include<iostream>
using namespace std;
int input_check(char start[],char destin[])
{int i,find_start=0,find_destin=0;
char A[20][5]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1","A10","A11","A12","A13","T2","A14","A15","A16","A17","A18"};
char B[17][5]={"B1","B2","B3","B4","B5","T1","B6","B7","B8","B9","B10","T2","B11","B12","B13","B14","B15"};
for(i=0;i<20;i++)
{if(strcmp(start,A[i])==0)
find_start=1;
if(strcmp(destin,A[i])==0)
find_destin=1;
}
for(i=0;i<17;i++)
{if(strcmp(start,B[i])==0)
find_start=1;
if(strcmp(destin,B[i])==0)
find_destin=1;
}
if(find_start&&find_destin&&(strcmp(start,destin)!=0))
return 1;
else
return 0;
}
int station_count(char start[],char destin[])
{int i,start_index=0,destin_index=0,count;
char start_type,destin_type,*temp=new char[5];
if((start[0]>destin[0])||((start[0]==destin[0])&&(strlen(start)>strlen(destin)))||((start[0]==destin[0])&&(strlen(start)==strlen(destin))&&(strcmp(start,destin)>0)))
{strcpy(temp,start);
strcpy(start,destin);
strcpy(destin,temp);}
start_type=start[0];destin_type=destin[0];
for(i=1;start[i]!='\0';i++)
start_index=10*start_index+(start[i]-'0');
for(i=1;destin[i]!='\0';i++)
destin_index=10*destin_index+(destin[i]-'0');
if(start_type=='T'&&destin_type=='T')
return 6;
if(destin_type=='T')
{if(destin_index==1)
{if(start_type=='A')
{if(start_index>=1&&start_index<=9)
count=11-start_index;
else if(start_index>=10&&start_index<=13)
count=start_index-8;
else if(start_index>=14&&start_index<=18)
count=start_index-7;}
else if(start_type=='B')
{if(start_index>=1&&start_index<=5)
count=7-start_index;
else if(start_index>=6&&start_index<=15)
count=start_index-4;}
}
else if(destin_index==2)
{if(start_type=='A')
{if(start_index>=1&&start_index<=9)
count=(start_index+6<16-start_index)?(start_index+6):(16-start_index);
else if(start_index>=10&&start_index<=13)
count=15-start_index;
else if(start_index>=14&&start_index<=18)
count=start_index-12;}
else if(start_type=='B')
{if(start_index>=1&&start_index<=10)
count=12-start_index;
else if(start_index>=11&&start_index<=15)
count=start_index-9;}
}
}
if(start_type=='A'&&destin_type=='A')
{if((start_index>=1&&start_index<=9)&&(destin_index>=1&&destin_index<=9)||(start_index>=10&&start_index<=13)&&(destin_index>=10&&destin_index<=13)||(start_index>=14&&start_index<=18)&&(destin_index>=14&&destin_index<=18))
count=destin_index-start_index+1;
if((start_index>=1&&start_index<=9)&&(destin_index>=10&&destin_index<=13))
count=(destin_index-start_index+2<20-(destin_index-start_index))?(destin_index-start_index+2):(20-(destin_index-start_index));
if((start_index>=1&&start_index<=9)&&(destin_index>=14&&destin_index<=18))
count=(destin_index-start_index+3<19-(destin_index-start_index))?(destin_index-start_index+3):(19-(destin_index-start_index));
if((start_index>=10&&start_index<=13)&&(destin_index>=14&&destin_index<=18))
count=destin_index-start_index+2;
}
if(start_type=='B'&&destin_type=='B')
{if((start_index>=1&&start_index<=5)&&(destin_index>=1&&destin_index<=5)||(start_index>=6&&start_index<=10)&&(destin_index>=6&&destin_index<=10)||(start_index>=11&&start_index<=15)&&(destin_index>=11&&destin_index<=15))
count=destin_index-start_index+1;
if((start_index>=1&&start_index<=5)&&(destin_index>=6&&destin_index<=15)||(start_index>=6&&start_index<=10)&&(destin_index>=11&&destin_index<=15))
count=destin_index-start_index+2;
}
if(start_type=='A'&&destin_type=='B')
{if(start_index>=1&&start_index<=9)
{if(destin_index>=1&&destin_index<=5)
count=17-start_index-destin_index;
if(destin_index>=6&&destin_index<=10)
count=(destin_index-start_index+6<17-(destin_index-start_index))?(destin_index-start_index+6):(17-(destin_index-start_index));
if(destin_index>=11&&destin_index<=15)
count=(destin_index-start_index+6<start_index+destin_index-4)?(destin_index-start_index+6):(start_index+destin_index-4);
}
if(start_index>=10&&start_index<=13)
{if(destin_index>=1&&destin_index<=5)
count=start_index-destin_index-2;
if(destin_index>=6&&destin_index<=10)
count=(start_index+destin_index-13<26-start_index-destin_index)?(start_index+destin_index-13):(26-start_index-destin_index);
if(destin_index>=11&&destin_index<=15)
count=destin_index-start_index+5;
}
if(start_index>=14&&start_index<=18)
{if(destin_index>=1&&destin_index<=10)
count=start_index-destin_index-1;
if(destin_index>=11&&destin_index<=15)
count=start_index+destin_index-22;
}
}
return count;
}
void main()
{int count,flag;
char start[5],destin[5];
cin>>start>>destin;
flag=input_check(start,destin);
if(flag)
{count=station_count(start,destin);
cout<<count<<endl;}
}
以下则是我机试时的考题:
考试时间:2013年9月12日下午2:00-4;00(两个小时)
考试地点:南京华为研究所N5三楼培训大厅(南京软件大道101号)
上机环境:C/C++: VS2005(或VC6.0) Java:JDK1.7
试题类型:上机编程
(自己写的程序,水平很烂,各位看官见笑了):
1、删除一个字符串首尾的下划线。
例如,输入:hello_
输出:hello
注意:1、删除的是首尾的下划线,中间如果有的话则保留;
2、要考虑一个字符串全是下划线的情况。
#include<iostream>
using namespace std;
void underline_delete(char *str,int len)
{int i,j,k;
if(str==NULL)
return;
if(len<1)
return;
for(i=0;str[i]=='_';i++);
for(j=len-1;str[j]=='_';j--);
if(i>j)
{strcpy(str,"");
return;}
else
{char *Str=new char [len+1];
int Len=0;
for(k=i;k<=j;k++)
Str[Len++]=str[k];
Str[Len]='\0';
strcpy(str,Str);
delete [] Str;
}
}
void main()
{char str[100];
int len;
gets(str); //hello_//_Hello_HuaWei_//_This_is_a_C++_program._
len=strlen(str);
underline_delete(str,len);
cout<<str;
//cout<<endl;
}
2、剔除一个字符中重复的字符,然后按ASCII码值从小到大排列。
例如,输入:abbcccddeeeffgghh
输出:abcdefgh
注意:1、剔除是整个字符串中重复的字符,而不是连续的字符
2、要考虑空格(space)的情况(考试时忘了考虑这个,当时心情有点小紧张,一时疏忽了,因此这道题只得了一半分)。
程序代码如下:
#include<iostream>
using namespace std;
void sort(char *str,int len)
{int i,j,k;
char ch;
if(str==NULL||len<2)
return;
for(i=0;i<len-1;i++)
{k=i;
for(j=i+1;j<len;j++)
if(str[j]<str[k])
k=j;
if(k!=i)
{ch=str[k];str[k]=str[i];str[i]=ch;}
}
}
void redundance_delete(char *str,int len)
{int i,diff_count=0;
char ch;
if(str==NULL)
return
if(len<1)
return;
sort(str,len);//先排序,再剔除字符串中重复的字符,否则剔除的是连续出现的字符
char *Str=new char[len+1];
diff_count++;ch=str[0];
Str[diff_count-1]=ch;
for(i=1;i<len;i++)
{if(i==len-1 && ch!=str[i])
{diff_count++;ch=str[i];
Str[diff_count-1]=ch;}
while(i<len && ch==str[i])
i++;
if(i>=len)
break;
diff_count++;ch=str[i];
Str[diff_count-1]=ch;
}
Str[diff_count]='\0';
strcpy(str,Str);
delete [] Str;
}
void main()
{char str[100];
int len=0;
//用cin函数输入的话,编译系统会将空格' '当作结束符'\0'来处理
gets(str);//abbcccddeeeffgghh//ab ba cd dc//dcbaabcd//abcd efgh_
len=strlen(str);
redundance_delete(str,len);
cout<<str;
}
3、渡口问题(原题我记不得了,大概如下):一个渡口有N辆客车和货车需要乘船,规定如下:
同类车辆先来的先上;客车优先于货车;客车上了4辆后货车才可以上;客车若不足4辆则货车可以补充;若无货车则客车可以全上。其中客车的优先级为0,货车的优先级为1。
例如,输入:5
0 0 1 0 1
输出:0 1 3 2 4
注意:1、输出的是原车辆在序列中的序号,且从0算起,因而前后交换时要保持相对顺序不变;
2、要考虑客车不足4辆,或者货车数量和客车数量有一者或两者为0的情况。
#include<iostream>
using namespace std;
void shift(int len,int a[],int pos)
{if(len<1)
return;
if(pos<0)
return;
int i,s;
s=a[pos+len];
for(i=len;i>0;i--)
a[pos+i]=a[pos+i-1];
a[pos]=s;
}
void ferry(int num, int input[],int output[])
{int i,truck_num=0,bus_num=0;
if(num<1)
return;
for(i=0;i<num;i++)
{if(input[i]==0)
bus_num++;
else if(input[i]==1)
truck_num++;
else
{output[0]=-1;
return;}
output[i]=i;}
if(truck_num==0||bus_num==0)
return;
int truck_count=0,bus_count=0,len,pos=0;
for(i=0;truck_count+bus_count<truck_num+bus_num;)
{if(bus_count<bus_num && bus_count%4==0)
{pos=truck_count+bus_count;
if(input[pos]!=0)
{for(i=pos,len=0;input[i];i++,len++);
shift(len,input,pos);
shift(len,output,pos);}
pos=truck_count+(++bus_count);}
while(bus_count<bus_num && bus_count%4)
{if(input[pos]!=0)
{for(i=pos,len=0;input[i];i++,len++);
shift(len,input,pos);
shift(len,output,pos);}
pos=truck_count+(++bus_count);}
if(bus_count>=bus_num)
return;
if(truck_count>=truck_num)
return;
if(input[pos]!=1)
{for(i=pos,len=0;!input[i];i++,len++);
shift(len,input,pos);
shift(len,output,pos);}
pos=(++truck_count)+bus_count;}
}
void main()
{int i,N;
cin>>N;//5//9//6//3//4//8
int *input=new int [N],*output=new int [N];
for(i=0;i<N;i++)
cin>>input[i];//0 0 1 0 1//1 1 0 1 0 0 1 1 0//1 1 0 0 1 0//1 1 0//0 0 0 0//1 1 0 0 1 0 0 1
ferry(N,input,output);
if(output[0]!=-1)
{for(i=0;i<N;i++)
cout<<output[i]<<' ';}//输入输出序列中,数字以空格分开
delete [] input,output;
}