面试前
申了暑期的实习,岗位(对我来说)只有一个,就是SDE。前期赶论文一直没空准备,基础又不好,在原定电面时间的前一天发了邮件希望delay到下周,死缓了四天。选的语言是Python,花了10天(其实还应该去掉没状态 or 接待朋友 or 批改作业 or 做线上笔试题的那么几天)过了一遍《数据结构与算法-Python语言描述》。
面试过程
共享文档
电话很准时。先要求打开共享文档,确认是否ok。结果因为我delay过一次,两次邮件发的链接不一样,所以耽误了一点时间,花了两分半。
自我介绍
其实没什么准备,因为觉得自己也没什么亮点,对方应该不会有什么想问的吧,今天主要应该是下面的做题吧,所以简单讲了两句。面试官问了下我的研究课题和采取的实现方式,问了对tf等深度学习框架的使用情况。前者我倒是讲得算仔细,后者其实没深入使用,面试官就没问了。大概讲了五分钟。
做题
因为我有web方面的经历,题目背景是HTML里面的DOM和文字搜索功能。总结一下就是以下内容:
# eg. input and structure
tree = {'tag': 'html', 'children': [{'tag':'b', 'children': [{'text': 'hello'}]}, {'tag':'i', 'children': [{'text': 'world'}]}]}
# 实现下面函数找子串
def Search(tree, sub_str)
# 给了几个输入输出,返回的True或者False
思路
问思路,想了会,答深搜,找叶子结点,把字符串连起来,从这个字符串里找子串。
问复杂度,答分两部分,一个是树的遍历,一个是子串搜索。
说假设结点数n,最长的word的长度为M。前者我确认了下默认二叉树么,说不是,问有差吗,我说边的数目有差。树的遍历时间应该是O(n)
,我想着有n个结点,每个结点最多要走的长度就是树高log(n)
,于是说时间是n*log(n)
。唉,好白痴。
子串搜索问我怎么搜,这里用k记搜索的子串的长度。我说total的长度是’n*M’(其实不对)。我说可以遍历检查(只想到了这个),问有什么更好的方法吗,我想的是当然应该要有啊可是我想不起来…其实之前看过Python里面找子串的实现的,可是忘记了,也没想着翻手边的书(紧张起来就这样= =)停顿了好一会,面试官说想不出来没关系,我们实现一下这个算法吧。到这里20分钟过去了,我给思路和想时间复杂度时反应还是太慢了。
写代码,深搜,可是忘了,凭感觉在写,写得磕磕碰碰,语法也不对。最后没时间了,刚好写完。面试官一直在打哈欠。
提问
因为时间关系,面试结束。我问了对我的建议,曰算法和coding还要加强。面试官说自己对python其实不熟,但看我对python好像更不熟。
电面后
- 想起了找子串的方法
- 搜了下找子串的内置函数,刚刚写错了
- 而且因为用的是内置函数,其实应该转换一下返回的值
- 对dict的使用不对
- 入栈出栈也有问题
最后贴一下改完的代码吧…
def Search(tree, sub_str):
total = ""
tr = tree
st = [tr]
while(st != []):
tr = st.pop()
if tr.has_key('tag'):
for i in range(len(tr['children'])-1,-1,-1):
st.append(tr['children'][i])
if tr.has_key('text'):
total += tr['text']
print total
if len(sub_str)==0:
#Error
raise Error()
return total.find(sub_str)
总结
- 道理我都懂,但是写起来就是不顺手,看过的容易忘,所以还是要多写
- 具体语言常用的要多用,想不起built-in func好亏,c++的STL其实我用过的也很少…
- 梦想还是要有的,好好准备下一次面试吧
- 跟着这个repo 学习吧!