华为面试经历

这篇博文主要来说说自己的华为面试经历吧。

这是一条时间轴(。・∀・)ノ——我是7月17号投的简历,那一阵子应该是在做数字图像的课程设计,之前给自己立的flag是7月20号之前投简历,也算是完成了。8月13号收到了上机通知,当时因为完全没准备,心里没底,给拒掉了。理论上应该是一周后的8月20号再次收到通知,但是并没有。就这样时间推移到了8月26号,华为来我们学校开岗位推介会了,我最终投递了上海无线网络产品线嵌入式软件开发岗位。终于在9月3号我又收了上机通知,9月4号完成了上机,9月5号做了性格测试。正式面试时间安排在9月17、18号,我被安排在了18号。

9月30号我收到录用通知啦!

上机考试

软件类上机考试一般有三道题,我前期准备的时候用的是牛客网的华为上机练习。本身我以为我会在一周后考试,

当时我打算108道题,差不多七天能做完吧,结果发现自己真的是太naive且盲目乐观吧Orz。

上机考试中有很多题用python写就很方便,所以我复习了一波python。

好了,说说这次的上机题目。

第一题:小明买钉子

小明去钉子店买钉子,钉子只有两种包装,4个一盒装、9个一盒装,钉子只能整盒买。

输入:小明需要的钉子数n(n<200)。

输出:如果可以购买,请输出购买的最小盒数

​ 如果无法购买,请输出-1。

这一题一上来我有点慌,因为按照牛客的题目我期待中的第一题应该是字符串那种比较简单的题目,这个计数,那个反转啦……我又想了下递归那种,感觉很难,主要是自己很菜,愣了二十分钟。换了一种思路,直接暴力求解了,找整数解就行了,一个变量作为循环的index,看另一个能不能有整数解,如果为负数就直接结束循环。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#第一题 4x+ 9y=n
def jiefc(z):
jie = []
maxN = z//9 #最大循环次数
for N in range(maxN + 1):
F = (z - N*9)/4 #求解
if F<0:
break
elif (F - int(F))==0:#是否为整数
jie.append([F,N])
return jie
while True:
try:
n = int(input())
answer = jiefc(n)
if answer==[]:
print(-1)
else:
total =[j[0]+j[1] for j in answer]
print(int(min(total)))
except:
break
第二题:实现一个简单代码解释器

输入:

第一行输入一个整数n,接下来会输入n行代码;

输入的代码只有赋值和计算,计算只有加法;

4
xx= 4
yy = 1
zz= xx
cd = xx + yy+ zz

所有的变量名中不包含空格,所有代码输入符合格式。

输出:对代码进行解释,如果代码出错,输出NA

比如下边代码中第三行等号右边的cc在之前的代码里没有出现,这段代码显然是有问题的

4
xx = 4
yy = 1
zz= cc
cd=xx + yy+ zz

假如代码无误,则输出最后一行等号左边量最终的结果

这道题一上来也懵。但仔细想想,其实就是只有加分和赋值,赋值分为用整数直接赋值和用有效变量赋值。

唯一出错需要返回NA的原因就是使用了前边未出现过但现在出现在了等号右侧的无效变量。这题的思路就是把变量和其数值存起来,遇到无效变量直接返回NA,接收下一组代码;先判断前n-1行代码是否无误,无误则处理最后一行代码,单独判断最后一行代码有没有问题,没问题就输最后一行左边出最终结果。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
def jiafa(s,chart):#求和,chart为有效变量表
jiasu = s.split('+')
he = 0
legal = 1
for i in jiasu:
if i.isdigit():
he += int(i)
elif i in chart.keys():
he += chart[i]
else:
legal = 0
break
if legal ==1:
return he
else:
return 'e'
while True:
try:
kv = {}
n = int(input())
stopflag = 0
for i in range(n-1):
exp = input().split('=')
zuo, you = exp[0].replace(' ',''), exp[1].replace(' ','')
if '+' in you:
kv[zuo] = jiafa(you,kv)
if kv[zuo] == 'e':
print('NA')
stopflag = 1
break
else:
if you.isdigit(): #只赋值,无运算
kv[zuo] = int(you)
elif you in kv.keys():
kv[zuo] = kv[you]
else:
stopflag = 1
print('NA')
break
if stopflag:
stopflag = 0
else:
exp = input().split('=')
zuo, you = exp[0].replace(' ',''), exp[1].replace(' ','')
if '+' in you:
kv[zuo] = jiafa(you,kv)
if kv[zuo] == 'e':
print('NA')
else:
print(kv[zuo])

else:
if you.isdigit(): #只赋值,无运算
kv[zuo] = int(you)
print(kv[zuo])
elif you in kv.keys():
kv[zuo] = kv[you]
print(kv[zuo])
else:
print('NA')
except:
break

第三题 判断json格式是否错误

输入 json格式数据

  1. 键值对{“*”: ”\*\”};

  2. 一键对应多个值{“***”: [”****”, “***”]};

  3. 键值对可以嵌套使用

{“**”:

​ {

​ “**\*”,

​ “*****”

​ }

}

输入为多组json字符串,每组就只是一行字符串;

错误类型:

如果缺少大括号,记为0;

缺少中括号,记为1;

缺少引号,记为2;

缺少逗号,记为3;

输出
返回错误类型代号,多次同类型错误返回一次。比如犯了1,2,3类型错误,就输出123;
如果没错就输出‘y’。

这题一上来,我先想到的正则,但正则只能知道对在哪里,不知道错误类型,而且这道题正则真的也不好写。而且json键值对可以嵌套使用,感觉这题得用嵌套、递归最小子问题那一套,我就很虚。

后来有和同学交流,他用简单粗暴的方法就是直接统计数量。前括号,后括号看数量是否一致;引号数量看是否为偶数。逗号就没办法了。这种方法显然是错的。(ノへ ̄、)

我自己又想了想实在是想不出来,计算机的朋友说这个类似于编译原理词法分析器,另一位计算机的朋友说她的思路是栈,遇到符号先push,遇到匹配项pop,全部遍历完后,栈里剩的就是没有匹配项的错误字符。但是我不会栈,哎。我有顺着词法分析器去查怎么实现json解析器。看到了好久之前大概17年时候,我有留意的一个教程,是Milo Yip大佬出的从零开始的 JSON 库教程,有一种自己在平行时空里兜圈子的感觉。又去试着学习一下,不过c确实忘得太多了,那我要立一个flag,过一阵子我就回来填坑

面试

面试前几天,我在复习自己参加的比赛,做过的项目。面试头一天,我在网上查了华为嵌入式面试的题目,有很多c,指针,操作系统,寄存器的问题,特别虚。。。晚上我问了下同学关于第三题的想法,被告知有很厉害的大佬面试凉了,一上来直接Leetcode上中档或者难的题目,而且还提前被通知面试了。晚上赶紧看了一下大佬们遇到的题目:接雨水、锯齿数组。哎/_ \,确实不经过练习是有难度的。、

一面

我接到通知短信安排面试时间是9月18号上午10:00,过去先刷身份证排队,我很快就一面了。我一面的面试官是8月26号岗位推介会上见过的,对方当时对我印象应该不错。一上来我就说,“又见面了”,面试官回“那你应该没那么紧张了”( ̄︶ ̄*))。

先是自我介绍。再问我关于上机题目的思路。看了下我github的库,我还真的有点紧张,面试官电脑上不了外网,我用我的手机给他看github,紧张的找不到浏览器放在了哪里Orz。我没有在上边放c的代码,可能对方比较关注c,问了我关于strlen()和sizeof()的区别,我记得sizeof会返回类型所占的内存byte数,strlen忘了。所以这题答得不好。

还问了之前做数学建模的我的角色。

接下来就是手撕代码,给我了一道括号匹配的问题,知识点就是栈,我赶紧补充了下上机第三题用栈的思路,并表示自己并不会栈。面试官给我换了一道题

给一个数组,比如[3,3,4,2],返回数组中数字能组成的周长最大的三角形周长,为7。

我一上来没看到题目提示“排序”,铁憨憨地认为是求出所有3个数和的结果存在list中,在求最大值。面试官说我想的太复杂了,而且三角形需要满足两边之和大于第三边,提示我答题卡上的关键词为“排序”,我就有了思路,想把所有数从大到小排出来,从前朝后找最大的三个和且满足三角形条件的。不过后边写的是时候,出了点问题,我没想全,在排序之后,认位1,2位置固定,遍历找第三个,其实假如第三个也不符合,就直接不符合了,因为在3位置之后的一定不会比3位置上的数大。正确思路是在排序之后,从前向后找最大边长出现的位置,比如[6, 3, 3, 2, 2],满足条件的是3,2,2。

这个时候我以为我凉了,我就问说假如第一轮题目就没做出来,是不是就凉了。他说是,我说那我就没通过了。面试官说我通过了,因为这题主要考排序,而我用的python一个sort()就做了,他之前有问一下sort的接口参数。还挺喜出望外的,因为听说大佬们都很难,自己确实没什么信心。只能说自己很幸运了。

1
2
3
4
5
6
7
#用python就很简洁啊!
a = [1, 2, 2, 3, 3, 6]
a.sort(reverse = True)
for i in range(len(a)-2):
if a[i]<a[i+1]+a[i+2]:
print(a[i]+ a[i+1]+ a[i+2])
break

结束时,一面面试官评价我,最让他感动的是我学习的精神,对上机题目的探究,各种问别人,(゜ー゜)就是基础不太行。

二面

一面结束后,很快就收到一面通过和去二面的通知,大概五分钟以内吧。

第二面也是先自我介绍,说我成绩不错。然后问了我最近用的语言,我说最近python用的多,比较熟,因为上机python比较方便。我补充说嵌入式用c比较多,c的话我们有课但是有一阵子不用了。面试官说,没事现在主流语言用的都挺多。

然后项目,让我说一个自己觉得比较好的项目。我就说了python爬虫那个,以及里边遇到的问题。json格式可以直接解析,我用了正则;数据库匹配失败,用了excel,面试官说,数据库不是你项目里的主要部分所以就放弃使用了,我回是的,并且excel可以来代替,只是一个excel文件里存多张表单文件会变大加载速度会变慢,不很方便。面试官说,看来excel还是不能完全代替数据库啊。我有说了因为网慢,返回错误5XX。去网吧跑程序的经历。还说了关于unix时间戳的事情。感觉面试官都get到了我的点!又说了有的页面还是有问题,我的方法是改变循环的start index,比如第5个好友空间页面的错了,下次就从第6个好友开始,面试官说了一个特别专业的词汇错误断点,异常断点之类的,我给忘了。

接下来,又是考察知识点的问题,问怎么排序,我说python就很容易,面试官说sort呀,我说是,就很好用。他问我知道哪几种排序,我说上午看了一点有冒泡,快速排序,插入排序,别的忘了。

他给我出的题目是写冒泡排序并优化。

1
2
3
4
5
6
7
a = [6,5,4,3,2,1]
for i in range(len(a)-1):
for j in range(i+1,len(a)):
if a[i]>a[j]: #升序
a[i], a[j] = a[j], a[i]

print(a)

怎么肥事,写的时候脑子很空。

接着对方问我怎么优化,比如[1, 2, 3, 4, 5, 6, 7, 8, 10, 9],其实是不用排前边的,只需要交换最后两个就行,不需要遍历多余的次数,怎么优化。我的思路一上来就是很复杂的,用(index, value),判断对应位置上元素变了吗,没变就是不用排,不过似乎更复杂了。面试官问,假如是不用这么复杂的,就比如第一轮就把10,9交换了,后边就不用排了。在我的程序里,是最后一轮才会交换10,9。Orz,后边的问题似乎就将错就错了。

我想到用一个flag,初始0,假如没交换位置的话,flag记为1,如果是1,就break。他说着就很容易break掉,我说要是能用Verilog的并行就好了,他说你其实是太紧张了,你想得出来的,没关心,这个是额外的。我又想了下换种思路,还是flag法,假如初始为0,交换是1,一直不换就break。发现面试的时候好像写错了Orz。不过没事对方应该明白了我的想法。

1
2
3
4
5
6
7
8
9
10
a = [2,1,3,4,5,6]
for i in range(len(a)-1):
flag = 0
for j in range(i+1,len(a)):
if a[i]>a[j]: #升序
a[i], a[j] = a[j], a[i]
flag = 1
if not flag:
break
print(a)

大概就这样,不用遍历完,发现面试的时候真的很乱啊Orz,希望不要有课后阅卷。

然后面试官说,感觉你挺喜欢编程的,刚才讲自己讲爬虫的时候很开心。我说嗯,是一个很有趣的体验吧,也体现出了爱去网吧的特点,感觉自己膨胀了,赶紧说,这是玩笑的,其实我觉得变成很重要,是做科研,做技术必备的工具。

然后二面就结束了,告诉我在外面稍等一会儿。

三面

三面是主管面,感觉是个领导,应该不做tech了???

问的问题有:

1.研究方向是什么?有点懵,我回答的是课程分类。他问我你的毕业设计是什么?还没选呢。

2.做项目你是怎么选择学习?

找网上的资源跟开源资料。

这么多资料怎么选择?

以任务为导向,请教他人。

一般在那些开源平台学习?

中国大学mooc,courses,书籍。

3.最近看了什么技术类的书?

一本网络书籍,python—cookbook。

你有什么收获,总结下书的重点?

这本书类似于速查手册,我能很快的掌握python的某种方法,而不用了解底层的东西。

没明白,什么叫底层?

就是最近在做上机,看这个类似于复习,我需要一个提纲一样的东西我不需要像第一遍看一样了解很多细节。

除了这本,还看过什么?

去年看了linux嵌入式编程,里边讲了一些嵌入式编程和软件变成的区别,比如const,volatile之类的怎么用。

4.团队合作你愿意做什么角色?

组织者,而不是领导者,提出自己的想法。

就是一个提意见的角色?

对,但是是以完成任务为导向的。

5.遇到什么问题,怎么解决,找方案,还是放弃?

爬虫遇到的问题,怎么解。

6.华为压力大?

做比赛压力就很大,我抗压能了不错的。、

7.想来华为吗?

特别想,优秀的本科生,研究生都去了,我也去。

8.你有什么问题?

岗前培训。

大概差不多就这样吧,今天面试感觉暴漏了很多自己的缺点,也展示了自己的优点。无功无过吧。

想想大概最难的是需要面对内心的struggle,这篇文章大概率会在10天内更新吧。

无论结果如何,我都觉得自己很幸运了。

今天天气凉爽,睡个好觉。哈哈哈哈又想起了海涅的那句话……つ﹏⊂

10月1号更新

距离面试过去12天了,这些天总体来说还算是忙碌充实,但心里还是挺焦虑的。事情压在一起,人就会很乱。虽然说觉得自己大概率是可以有offer的,也做好了被刷掉的准备,但是总是希望有个好结果吧。happiness = reality - expectation,期望越大容易失望越大吧。

我以为9月29号会来通知的,结果并没有,30号又听到朋友说有的部门发通知了,隐隐的还是有点着急。晚上回去洗澡的时候,洗到一半还停水了,幸好还没用沐浴露,在心里自嘲——可真是给充满困惑的九月画上了一个圆满的问号?(⊙ˍ⊙)

昨天大晚上22:59收到了意向书邮件,23:01收到了通知短信。本身特别困,跟好朋友们和家里人分享了一下后自己躺在床上脑子里有很多很多杂念,想着自己做的很多选择,想着接下来的机遇跟挑战。00:30还没有入睡。本来是想第二天早上再去看意向书的,1:00干脆开电脑签了算了。大概是一点多快两点入睡的吧。好像很少有这种开心的睡不着的时刻吧,主要是这个消息是晚上来的,没有缓冲时间。

总而言之,能被录用真的觉得自己特别幸运。还有就是觉得自己之前做的好多事情,看到的内容可能当时看起来无关紧要,但其实都产生了蝴蝶效应,又能归因于随机过程。这次又算是我向宇宙发出了信号,宇宙给了我正向的回应吧。

还有一些话就等到过一段时间再来说吧。