interviews

2014-03-26 14:53

title 豌豆荚一面总结
md_linebreaks: two

今天是豌豆荚的第一面,远程电话面试。虽说不是第一次电面,但很多地方做的很不好,后面继续
调整。

首先是面试形式没有什么玄乎的,和之前参加的电面形式差不多,只是多了一项现场写代码的环节,
通过协作网站 http://collabedit.com 完成。面试官很准时,约好的11点,分钟不差发来链接,接着
就是电话开聊,感觉这个工程师对我的项目经历很感兴趣,前半个小时一直在听我描述我做的那个wifi
项目,本次面试的很多错误就在这里犯下了。所谓越是自己熟悉的地方越容易出错,此言大善。谈完
项目,时间也差不多了,直接就开始码了。面试官给出了一道题,给定一个list,每个元素都是一个
tuple,每个tuple有两个整数元素,代表一个树的节点。第一个元素是该节点的data,第二个元素是
父节点的data,让根据这么一个list建立一个树,能提供根节点查询,和任意节点的孩子查询,data
查询等三个操作。

语言不限,可以C++,也可以python。C++好久没写了,特别是stl,把不准会不会出错。本题给的情形
又很适合STL和python做,稍微权衡了一下,还是选了python。python高级的东西还是不会用,但初级
的还可以。写个树倒也不难,本题中的每个节点我定义成了一个dict项,由于data域都是不等的,所以
直接做key是可以的。value定义成一个list,第一项为data,第二项也是一个list,保存所有child的
key。这么一来,程序就大致明了了,把每个节点插入到这个dict中就可以了。这一步我想的很明白,
但下来怎么找到root节点就不容易了。我在这里估计想了有快10分钟,严重浪费了时间。实际上简单的
遍历一边key,找到不在最初list中的key,也就是没有父节点的节点,就可以了,但我就是不想做两次
for循环,也不想浪费额外的空间,想找一个好点的办法在构建树的同时完成root的标注。这个纠结了
快10分钟,实在不应该。

最终的代码写的还好,构建树没有bug,但root节点查找时因为慌张,用了个笨办法,显的很不漂亮。

#[(1,2),(3,1)...]

def init_tree(data):
    tree={}
    node=[item[0] for item in data]
    for item in data:
        tree[item[0]]=[item[0],[]]
        if tree.has_key(item[1]):
            tree[item[1]][1].append(item[0])
        else:
            tree[item[1]]=[item[1],[item[0]]]
    for key in tree.keys():
        if key not in node:
            tree['root']=tree[key]
            break
    return tree

def root(tree):
    return tree['root']

def get_data(node):
    return node[0]

def get_child(node,tree):
    return node[1]

data=[(1,2),(3,1)]
tree = init_tree(data)
print root(tree),get_child(tree[1],tree),get_data(tree[2])

上面的是我下来改后的代码,和现场写的差不多。

总结一下教训:

  1. 态度不够端正。主要是在陈述项目的时候,扯了太多不相干的东西,应用场景,开发目的之
    类的说太多。过于自恋自己的作品了。

  2. 现场写代码有点怯场,边上有人看着,总是不能集中精力去思考,导致用了过多的考虑时间。

  3. 考虑时间过多,这个真不应该。平时习惯了先考虑好了再下手,面试时时间紧,要适当分配。

  4. 过多注重算法和代码简洁。面试现场写代码和算法面试是两回事,现场写代码面试官注重的
    应当是代码能力,题都不难,但往往很注重代码控制能力,我的构建树,同时面的丽丽的输出螺
    旋矩阵,性质都一样,就是看你的代码熟练程度。但我过度考虑了怎么漂亮,高效简洁的问题。
    导致白白浪费了10分钟在考虑算法问题上。不应该,正确的做法是以一个最常见的方法没有bug
    的实现这个需求。代码能让人看懂,这个最重要。至于有没有用两次for循环什么的,可以不考虑。

  5. 多多写代码,熟练语言。仅仅看书复习是不够的,务必要多看时多写,手熟很重要。

教训就这么多,比较好的是本次现场代码写的还算漂亮,核心部分没有bug,代码组织的也比较好。


标签: 面试

分享到: