本人投的华为软件开发岗,本科985,项目经历2个但都很菜(三面面试官指出,你没有什么项目经历啊。。),三面完了10天内才出结果,先记录一下面筋以供食用。
由于2020年春招大多改为线上面试,所以今年华为的三次面试一下午就完成了。一面花了50min,二面花了50min,三面花了30min。三次都是一对一面试,三个不同的面试官,前两面面完很快出结果,紧接着就下一轮面试。
先进行自我介绍,然后没问自我介绍的内容,就打开一个文档里面是我机试做的结果,我机试就做出一道题,但显示超过31%(也可能是前31%?)的同期考核的人。从第一题开始讲,问自己的代码是怎么写的(可能看看有没有代考?),我讲完我做出的那道题之后,让我讲没做出来的题是怎么想的。我说第二题我不会,但第三题我会做,不会处理输入,然后就没让我讲第二道,就开始讲第三道。
讲完机试的题目之后,就现场给了一道题,记下题目之后,需要我共享屏幕过去,面试官看着我写。题目不难,很快写出来了,但半天结果不对,面试官:“调不出来啦?”。十分尴尬,后来面试官把样例给我了,发现是我自己写的数据有问题。。还好过了。。
//题目大意是有多行砖块,每行砖块的数量不一定相同,每块砖的长度也不一定相同。
//现在要画一条竖线,在哪里画穿过的砖块数量最少?
//下面是我现场写的代码
#include
#include
#include
#include
using namespace std;
const int maxn = 1000;
int blocks[maxn][maxn];
int main()
{
freopen("input.txt", "r", stdin);
string s; int line = 0, col = 0;
memset(blocks, 0, sizeof(blocks));
bool first = true;int width = 0;
while(getline(cin, s)){
int len = s.length();
for(int i = 0; i < len; i++)
if('0' <= s[i] && s[i] <= '9')
{
width+=(s[i] - '0');
blocks[line][col++] = (s[i] - '0');
}
line++; col = 0;
}
width /= line;
printf("%d\n",width);
int ans = maxn, now = 0;
for(int i = 1; i < width; i++){
now = 0;
for(int j = 0; j < line; j++){
int accu = 0;
for(int k = 0; blocks[j][k] != 0; k++){
accu+=blocks[j][k];
if(accu < i)continue;
else if(accu == i) {now += 0;break;}
else {now++;;break;}
}
accu = 0;
}
ans = min(ans, now);
}
printf("%d\n", ans);
return 0;
}
写完之后,面试官问我时间复杂度,我说 O ( w i d t h ∗ l i n e ∗ max { k } ) O(width*line*\max \{k\}) O(width∗line∗max{k}),问有没有更优的,我想了想没说话。面试官就提示学没学过哈希表,恍然大悟,我说用哈希表可以更优,可以达到 O ( l i n e ∗ max { k } ) O(line*\max \{k\}) O(line∗max{k}),那用哈希表怎么实现,我就讲了一下怎么实现。然后现场写代码环节就过了。
接下来随便聊了聊简历,就开始问专业知识,记得的有:死锁是什么?TCP握手的环节?内存页面置换算法?哪种置换算法是最优的?面完几分钟就接到通过的短信了,接下来就是二面。
二面来的很突然,我以为二面要过几天,结果一面完了不到十分钟二面短信就来了,赶紧进入视频房间。
同样先自我介绍,然后这个面试官对一个项目很感兴趣,但不是对项目细节感兴趣,而是对项目背景感兴趣,就聊了很久项目背景。然后就开始问操作系统,问了非常久,基础知识的方方面面都问到了,然后问用没用过Linux,我说用过,然后问Linux的命令:怎么看哪个进程占CPU最多(好像是这个意思)?怎么看IO?这两个我都不会,然后就问那看CPU利用率呢,这个总会吧?我说这个我也不会,但我是装了个插件可以实时显示CPU利用率的,然后面试官就在笑,说不问你Linux了。
然后就现场出了个题,“如何判断一个字符串是不是一个IPv4地址,就这个题,你开屏幕共享”。然后我正准备写,面试官说,这次别用IDE,用TXT写。然后我就用TXT写,写的结果在下面。
//TXT里原封不动粘过来了
#include
#include
using namespace std;
bool is_ip(string s){//只有数字或.
int len = s.length();
for(int i = 0; i < len; i++)if( ! (('0' <= s[i] && s[i] <= '9') || s[i] =='.') )return false;
return true;
}
bool is_enough(string s){//有3个.
int cnt = 0;
int len = s.length();
for(int i = 0; i < len; i++)if(s[i] == '.')cnt++;
return cnt == 3 ? true : false;
}
void string2num(string s, int ip[]){
int len = s.length();
int num = 0, cnt = 0;
for(int i = 0; i < len; i++){
if('0' <= s[i] && s[i] <= '9') { num*=10; num+=(s[i] - '0'); }
else if(s[i] == '.'){ip[cnt++] = num; num = 0;}
}
ip[cnt] = num;
}
int main(){
string s;
cin>>s;
bool ans = false;
if(is_ip(s) && is_enoug(s) ) ans = true;
int ip[4]; //
if(ans) string2num(s, ip);
for(int i = 0; i < 4; i++)if( !(0 <= ip[i] && ip[i] <= 255) )ans = false;
printf("%s\n", ans ? "yes" : "no");
return 0;
}
然后面试官就问0.0.0.0合法吗?.0.0.合法吗?(我上面写的还是有问题的)
然后还问了一些东西,已经忘了。。
三面还是技术面,先自我介绍,然后面试官说你没有什么项目经历啊。。那你什么课学的比较好,我说操作系统和网络原理,那什么课学的不好,我说编译原理。那这就很有意思啊,操作系统还是需要些编译的知识的,你怎么还学的挺好呢,那我就问你操作系统的东西吧,然后问了内核级线程内核级进程是什么?内核级进程和线程哪个好些?为什么?内存分配算法有哪些?如果你要实现内存分配算法你是怎么考虑的?用什么数据结构?我答了链表,问:仅链表就够了吗?那回收的时候还要遍历一次链表,消耗不会太大了吗?分页的好处是什么?没答上来。你说你写过MATLAB和Python,那在同样的硬件环境下,这两个哪个运行的快呢?我说MATLAB,为什么?因为MATLAB底层是C,Python通常比较慢。那这又是为什么呢?因为C是编译型的Python是解释型的(不知道对不对。。),然后又问了问内存的问题就结束了。
这次春招对代码水平还是很关注,先问机试题怎么写的,一面二面都要现场共享屏幕写代码(机试成绩好的可能就不用)。然后没有项目经历的话,基础知识问的是非常多的。刚面完一天,还没有过没过的消息。
上官网查了面试结果是未通过,看来项目经历是硬伤,做一些花里胡哨的东西并没什么用,吸取教训,继续努力。
还有一个就是华为网站上的简历要填清楚。。我才发现在官网上的简历除了名字和学校以外什么都没填。。