今天给大家分享一位战队中海外留学生面试华为遇到的经典面试题,顺便也给即将走出校园,迈入职场的小伙伴分享一下大厂的面试基本流程和注意事项。当然如果你只想看面试题和题解可以直接往下翻到面试题图片位置。
说到大厂面试题,不管大厂还是后厂,不管是远程(视频、电话)面试还是现场面试,只要研发岗(软件算法工程),那么面试题这一关是肯定逃不过的(内推除外),那么在面试的过程中肯定会有N多的问题等着考验你,有很多人面过大厂,动辄几个小时的“拷问”,一场面试下来,几乎都要虚脱了(大神请绕路)。
不管是面试(机试)的问题的多少,都会问到你答不上上来为止,而一旦你答不上来,很多面试官还会以为你想不起来而旁敲侧击的采用迂回战术反复提起相关问题,直到确认这个问题你不会。很多人不理解,明明我都答不上来,为啥还揪着不放呢?。
其实,说起来这个事情倒也不能怪技术面试官,他的目的其实很简单,就是一定要在面试完成前,彻底摸清你的技术功底,不放过也不错杀,毕竟面试的时间短暂,毕竟大家的时间都很宝贵,毕竟人家也是有责任在身的呀,当然不排除有的就是想刁难你,不过这种太少了,毕竟大家都是陌生人,为何无缘无故的得罪人呢?
那么既然时间短,又互相不熟悉,那么如何才能在短时间内对你进行一次彻底的技术摸底呢?这就要说到面试的流程上了,一般情况下,在你的简历提交之后,会有HR对简历进行初步判断和筛选,然后过了以后交由技术主管对简历进行技术方向的确认,过了这一关后,恭喜你,可能会等来面试邀请。
面试一般是分为HR人事方向面试和技术方向面试,HR主要会涉及个人经历、职业规划、优缺点、离职原因、期望薪资等方面进行提问,主要会在沟通中以观察你的沟通表达能力和性格等方面,同时对你的简历是否注水、是否符合公司文化等方面进行考察,一般这个如果不出大的问题的话,都会进行技术面试。
而技术面试这个在不同公司就不太一样了,一般是先技术面试官(部门的技术人员,未来的同事或者组长等)面试,过了之后在由技术负责人或者Leader也就是你未来的领导面试。那么在这个过程中,技术面试官如何快速摸清你的技术功底呢?基本上的套路和流程就是先做面试题或者机试,然后在进行技术面试。面试题在不同的公司也会不同,不过不管怎么面,你只要清楚,面试题主要在考察你的哪方面能力?
首先就是基础知识和知识深度
,比如常见的一些进程、线程、数据结构与算法、MySQL工作原理、索引结构等,当然也根据你面的不同岗位有些区分,不过基础知识的面试都大差不差就这些方面,那啥是知识深度呢?基本上就是上面的常见题或者根据你的回答继续深入追问,几乎问到你不会为止,对,就是一直追问下去,如果答不上来,就换个问题继续追问,对,就是这样,才能知道你有没有深度。另外一个重点就是解决问题的能力和思考能力
,这个可能有点不好理解,我们举个简单的例子,比如面试官出了一道你没做过的面试题,而且看起来也很难,可能会让你产生畏惧的心里,如果你放弃思考直接回答不会,那这可能就太鲁莽了,因为面试官可能也会觉得这个题对你有难度,但是他想看到你的思考过程和解决问题的能力,此时你可以介绍一下自己的思路或尝试给出一些解决方案,就算这个题真的不会写,可能也会给面试官一个比较正面的印象。当然还有很多,例如会问到你参与的项目或开发过程中遇到的问题,是如何解决的等来多方面考察你。so,如果你清楚了面试时在考察什么,并提前为此准备,并以积极的心态面试,那么你拿到offer的几率就大很多。当然很多在技术面试的过程中会根据公司、岗位等不同有不同的侧重点,比如数据结构与算法几乎是达成共识的一个侧重点。(妈呀、侧重点都能达成共识,哈哈)。当然也会有公司真的存在侧重点,比如在圈内共识的华为在技术研发岗位上除了数据结构与算法外,就特别爱问正则技术相关的面试题。这不,我们某战队里的海外留学生(英国布里斯托大学)在面试华为时就遇到这样的题,这也是今天分享的另一个重点。
以下来自英布(化名)同学的面试题分享
以上是本次分享的面试题截图,为了大家更好的阅读,下面为大家准备了文字版。
给定一段英文输入文本,判断文本是否满足如下规则的拼接形式。
规则1: —段不包含任何符号的纯文本(可以包含空格)
样例1: "hi", "good afternoon"
规则2: 圆括号括起来的文本,其中可以包含竖线"|"分隔符,竖线前后允许任意空格,但竖线前后必须有文本
样例2: "(yesterday | today|tomorrow)","(china)"
规则3:方括号括起来的文中可以包含竖线"|"分隔符,竖线前后允许任意空格,但竖线前后必须有文本
样例3: "[yesterday | today | tomorrow]", "[china]"
规则4:花括号括起来的两个数字,用英文逗号分隔“,”逗号前后允许有任意空格,并且 数字1<=数字2
样例4:"{3, 5}","{5 , 5}"
输入描述:
输入多行文本,分别对每一行进行判断,除了规则中出现的符号外,不考虑输入其他符号。
输出描述:
判断每行文本是否满足上述4种规则的拼接,满足返回1,不满足返回0
示例1,输入:
'''
{0,3}[give|show]{0,3}me{0,3}[the](money|cash){0,5}
[show)me[the](money|cash)
{5, 0}(money|cash){0,5}
( | money)
'''
输出:
'''
1
0
0
0
'''
说明:
第二行 出现了括号匹配错误
第三回 数字1>数字3
第四行 竖线前没有文本
怎么样?看到这道题,不知道你不是有压力呢?又或者感觉简直就是洒洒水呢?欢迎大家积极留言讨论。
接下来我们看一下,在本次面试题分享中关于题解的过程吧。
首先,我们看到这道题是一个正经八百的正则面试题。如果你有非正则解决方案也欢迎讨论。
那么根据题面是说给出的文本是有四种规则的,分别是普通文本、圆括号文本、中括号文本和花括号数字四种规则。那么我们先来把四种规则进行定义吧。
# 规则1: —段不包含任何符号的纯文本(可以包含空格)
# 样例1: "hi", "good afternoon"
varstr = 'good afternoon'
varreg = '^[a-zA-Z ]+$'
res = re.search(varreg,varstr)
print(res)
# 规则2: 圆括号括起来的文本,其中可以包含竖线"|"分隔符,竖线前后允许任意空格,但竖线前后必须有文本
# 样例2: "(yesterday | today|tomorrow)","(china)"
varstr = '(yesterday | today|tomorrow)'
varreg = '^\(\w+(([\w\s]+\|[\w\s]+)*|\w+)\w+\)$'
res = re.search(varreg,varstr)
print(res)
# 规则3:方括号括起来的文中可以包含竖线"|"分隔符,竖线前后允许任意空格,但竖线前后必须有文本
# 样例3: "[yesterday | today | tomorrow]", "[china]"
varstr = '[yesterday | today | tomorrow]'
varreg = '^\[(([\w\s]+\|[\w\s]+)*|\w+)\]$'
res = re.search(varreg,varstr)
print(res)
# 规则4:花括号括起来的两个数字,用英文逗号分隔“,”逗号前后允许有任意空格,并且 数字1<=数字2
# 样例4:"{3, 5}","{5 , 5}"
varstr = '{16, 15}'
varreg = '^\{(\d+)\s*,\s*(\d+)\}$'
res = re.search(varreg,varstr)
# 其中需要对数字1和数字2进行判断
if res and (res.groups()[0] <= res.groups()[1]):
print(res)
else:
print('error')
以上就是根据题面定义的四种规则,虽然看起来复杂,但是用心慢慢实现,最后看起来好像也不是特别难呀
不过,别得意,目前我们只是根据题面定义了四种规则,但是请详细阅读本题的输入输出要求:
# 输入描述:
# 输入多行文本,分别对每一行进行判断,除了规则中出现的符号外,不考虑输入其他符号。
'''
{0,3}[give|show]{0,3}me{0,3}[the](money|cash){0,5}
[show)me[the](money|cash)
{5, 0}(money|cash){0,5}
( | money)
'''
# 输出描述:
# 判断每行文本是否满足上述4种规则的拼接,满足返回1,不满足返回0
'''
1
0
0
0
'''
仔细看会发现几个问题,首先它给定的是一个多行文本,而我们需要对每一行进行判断,其实这个都不算什么大问题,split函数一步就可以搞定,把多行文本按行拆成列表即可。最最关键的问题是,你需要判断每一行的文本是否满足上述4种规则的拼接。
拼接?此时你可能会想这有啥难的?把刚才写的4个规则拼在一起不来验证不就可以了吗?其实这可能是一个惯性思维,很多人都会这么想,然后就会被绕进去了,你会发现你很难把那4个规则拼在一起,怎么拼?又如何一起检测?欢迎动手。。。
好了,我们也不卖关子了,大家可以在读一读题,就会发现这个题其实就是利用了一个惯性思维把你绕住了,如果你不去想把4个规则拼接起来进行检测,那么可能你会想到另一个办法,那就是我们分别使用4个规则对每一行文本进行去除也就是把符合规则条件的文本替换为空,最后4个规则替换完成后如果文本为空不就符合了吗?如果不为空就是错误的。
当然,首先不能按照出题顺序进行规则的替换,比如你先用第一个规则进行替换,那后面就没法玩了。所以可以先用第二个、第三个规则进行替换,然后在用第一个规则也就是普通字符进行替换,最后就剩下花括号数字的替换了,如果在这4个规则都替换完成后文本为空,那么就是首先确定了,它符合了4个规则的拼接,如果不为空则可以直接return 0,那么这样完成了吗?还没有,因为题目中的第4个规则,除了是符合要求的数字之外,还要求数字要<=数字2,那么这样我们就需要对第四个规则中的数字1和数字2进行提取再判断是否符合要求,才能最后确定文本是否真的符合要求。
分析完思路,我们来看一下代码的实现
import re
# 输入的文本
varstr = '''{0,3}[give|show]{0,3}me{0,3}[the](money|cash){0,5}as
[show)me[the](money|cash)
{5, 0}(money|cash){0,5}
( | money)
'''
# 检测数字
def checknums(arr):
for i in arr:
if not i[0] <= i[1]:
return False
return True
# 处理大文本,切割为每行组成的列表
arr = varstr.split('\n')
arr.pop()
# 定义行数
n = 0
# 循环文本行
for vars in arr:
n += 1
# 使用规则对文本进行替换,替换为空
res = re.sub('\(\w+(([\w\s]+\|[\w\s]+)*|\w+)\w+\)','',vars)
res = re.sub('\[\w+(([\w\s]+\|[\w\s]+)*|\w+)\w+\]','',res)
res = re.sub('[a-zA-Z ]+','',res)
res = re.sub('\{(\d+)\s*,\s*(\d+)\}','',res)
# 检测是否为空
if not res:
# 为空后,提取数字,检测数字是否符合规则要求
nums = re.findall('\{(\d+)\s*,\s*(\d+)\}',vars)
if checknums(nums):
print(f'第{n}行正确')
else:
print(f'第{n}行错误')
else:
print(f'第{n}行错误')
今天主要给大家分享了面试的流程、面试的考察点以及来自华为的面试题,希望能在你即将迈出的一步上给你一些帮助,希望你与后厂的距离又更近一步。
如果喜欢本文或对你有帮助的话,欢迎大家关注我的公众号:后厂程序员,并分享、点赞、在看 三连哦。