百度面试小结

今天有幸去百度面试,面试职位搜索研发部_实习研发工程师。最近几天感冒,主要是嗓子疼,相当难受。

早上8:30起床,出去吃了个早饭,然后10点钟就到了百度大厦,比要求的时间早了20分钟,10:30开始面试。

首先就是自我介绍啦,接着我们聊到前两天CSDN数据库被黑导致用户密码被盗,然后联系到我和同学做的一个小项目,项目是用PHP写的,面试官就问我是怎么处理用户登录信息的,我答用Cookie,当然我知道这个很不安全,但是小网站,只供本校学生使用,就没有考虑HTTP传输时被窃取,当然我数据库里面是用MD5加密过的。面试官就问我在传输的过程中应该怎么保密,我的第一反应就是加密啊,但是至于怎么加密真的不知道。后来这个问题就PASS过去了。

下面就是手写代码,这两天也看了些面试题,心里还算有点底气吧,但是不紧张是假的,多少还是有点的。也没写啥多难的题目,就一二叉树的前序遍历,我一分钟不到写出了个递归算法,这个大家都会写,然后面试官就让写迭代的代码。数据结构我学过,书上有的迭代的代码我看都没看,只是凭借着自己的理解吧,也就是把递归的栈具体实现就可以了,可惜第一次写的时候想简单了,写好之后面试官让自己跑个case验证下,当时就傻了,还没跑呢,我就自己看出来不对了。接着就是改代码啊,用到set判重,然后认真改下,也跑了case,应该程序是没有错的。回来看了看课本上的伪代码,要比我写的简单些,大体思路肯定是一样的,都是栈的实现。这里浪费了不少时间。

接下来面试官又出了个题目,这个题目没有让写代码,这时候离面试结束时间还差大概15分钟吧。

题目是这样的,给定一个百万级的字典,把里面的同源词分组输出,同源词定义:abc,cba,bac等只要是单词中每个字母出现的次数相同的单词就是同源词,给出一个算法,并且说出时间复杂度和空间复杂度和怎么存储字典。

存储应该用STL中的string就可以了。

当时就想了个比较搓的算法吧,时间复杂度是O(nlogn+n^2m),n表示字典中单词的数目,m表示单词的长度。

具体做法就是先对字典按照长度从小到大排序,因为同源词肯定是长度相同的单词,这里只能算一个简单的优化。

接下来就是用二重循环来查找字典,当然只比较长度相同的单词,然后比较两个单词每次字母出现的次数,找出同源词,然后把同源词的单词全部丢进set中,这样后面就可以跳过已经丢进set中的单词了。这应该是最简单的方法了,不过说出算法的时候,面试官一直让我说慢点,把算法的思路说清楚能让他更好的理清我的思路,我想这也是考我吧。

然后算法提出来了,这个肯定不是最优的算法,忘记说了,刚开始没有加数据范围的。加上上面的数据范围这个算法肯定会挂掉的,那么就要优化,我脑中很清楚肯定有O(nlogn)的算法,但是当时没有想出来吧,这时候离结束的时间只有2分钟吧,不一会面试官就告知面试时间到了。

最后也是惯例啦,让我问他一些问题,别的我也没多问,就问了点,他们的工作组是做什么的,用什么编程语言和开发环境,得到的答案是:研发部肯定是做产品的研发,具体的研发产品我记不清了,用的开发语言主要是PHP和C,开发平台是Linux,如果去实习肯定有个专门的辅导员带领。

回来的路上就在想最后那个问题的优化,logn让人能想起来的方法也就二分或者排序,可以确定这题的思路就是贪心,二分貌似不能够啊,一直就在想排序怎么排。

回到宿舍想到一个时间复杂度为O(nlogn+nmlogm+n)的算法,这种方法需要使用额外的内存空间,可以看作是空间换时间,首先就是对字典中的每个单词按照ASCII进行排序,这样当然就破坏了原字典,所以需要另外的存储空间来保留原字典,然后再对排完序的字典进行字典序的排序,这时候相同的单词肯定是连在一起的,这时候就遍历一遍字典,按照一种设计的排序后的字典和原字典的一种映射关系,找出同源词进行输出,这样问题就应该解决了。可惜的就是当时没有在第一时间想出来。


然后又和一个不认识的人通过一个认识的人QQ传话,他提出了一个可以实现O(n)的算法,找到一个合适的哈希函数能够把同源词全部哈希成相同的值,这样就可以在O(n)时间复杂度内解决问题,问题的关键就是如何找到这个哈希函数,而且找到的哈希函数不能只对当前字典有效,因为字典可能随时补充新的单词,要保证对任意单词的正确性。


最后总结下这次面试吧,自我感觉不好,首先先序遍历迭代的代码首先不应该写错,并且在此花费了比较长的时间,最后的一个问题现在觉得nlogn的思路应该不难想出,当时应该能够给出此算法,刚刚开始一些问题的回答也不太满意。所以对此次是否能够进二面不报希望。

感谢猫哥辛苦找人帮我争取的面试机会,很感谢猫哥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值