百度第三面失败经历
2015-11-10 15:59
316 查看
2015年10月17日,周六,下午两点半左右,参加了百度校园招聘的面试,软开C++方向。一面问的都是CS专业的基础问题,二面考察的较多基础编程,对C++基础的掌握程度,并要求现场写代码,还有些基本的数据结构操作等,三面问的是考察思维和对知识运用能力的题。在此记录三面的失败经历,以示后训。
设计题:
有一个数据库,存储有上亿的记录,每个记录都是用户搜索的关键词(假设所有关键词都是英文),现在要求给定一个单词(word),从数据库中找出所有相似的单词。此处相似单词的定义为:对单词A和单词B,分别删除它们所组成的字母序列中的重复字母(每个出现过的字母仅保留一个),如果两个单词删除之后的结果中,所包含的字母个数及种类相同,则认为单词A和B相似,否则不相似。
我的失败的思路:
对数据库中的单词进行预处理,生成一个key,用于检索。具体预处理过程如下:对任一单词W,去除其包含的重复的字母,然后对去重之后的结果中的字母按字母表顺序重新排列,生成中间单词W‘,这样所有相似单词W1,W2...它们的中间单词都是W'。然后对中间单词W'进行哈希,生成唯一的,等长度的一个值,即key。
此处考官问我,你怎么去确定这个哈希函数?给个具体的方案。
我试着回答几次,都不能另考官满意,之后便放弃了。
现在想到的较好的解决办法:
还是预处理,第一步还是去重,此时所有单词产生的中间结果最多有26个字母。将中间结果所包含的字母划归为一个集合,因而集合的所有可能为2^26种。我们可以根据这样的一个集合唯一确定一类相似的单词,现在的问题就是如何表示这样的集合。今天偶尔看到位图表示时才恍然大悟,其实在这里我对每一类相似单词的集合只需要4个字节就能唯一地表示它了,具体方法是:对于集合中出现的字母,在4字节变量key的对应位上置1,没有出现的字母则key的对应位置0 。So easy,可惜想出来得太晚了。
此次失败的经历暴露出我基础不够扎实的问题,亟需改正。
设计题:
有一个数据库,存储有上亿的记录,每个记录都是用户搜索的关键词(假设所有关键词都是英文),现在要求给定一个单词(word),从数据库中找出所有相似的单词。此处相似单词的定义为:对单词A和单词B,分别删除它们所组成的字母序列中的重复字母(每个出现过的字母仅保留一个),如果两个单词删除之后的结果中,所包含的字母个数及种类相同,则认为单词A和B相似,否则不相似。
我的失败的思路:
对数据库中的单词进行预处理,生成一个key,用于检索。具体预处理过程如下:对任一单词W,去除其包含的重复的字母,然后对去重之后的结果中的字母按字母表顺序重新排列,生成中间单词W‘,这样所有相似单词W1,W2...它们的中间单词都是W'。然后对中间单词W'进行哈希,生成唯一的,等长度的一个值,即key。
此处考官问我,你怎么去确定这个哈希函数?给个具体的方案。
我试着回答几次,都不能另考官满意,之后便放弃了。
现在想到的较好的解决办法:
还是预处理,第一步还是去重,此时所有单词产生的中间结果最多有26个字母。将中间结果所包含的字母划归为一个集合,因而集合的所有可能为2^26种。我们可以根据这样的一个集合唯一确定一类相似的单词,现在的问题就是如何表示这样的集合。今天偶尔看到位图表示时才恍然大悟,其实在这里我对每一类相似单词的集合只需要4个字节就能唯一地表示它了,具体方法是:对于集合中出现的字母,在4字节变量key的对应位上置1,没有出现的字母则key的对应位置0 。So easy,可惜想出来得太晚了。
此次失败的经历暴露出我基础不够扎实的问题,亟需改正。
相关文章推荐
- 黑马程序员——基础知识——基本数据类型包装类
- iOS面试题集锦
- P151、面试题27:二叉搜索树与双向链表
- 黑马程序员——反射——Class、Constructor、Field、Method及简单框架原理
- 黑马程序员——集合
- 黑马程序员——多线程
- 黑马程序员_ARC
- 黑马程序员——异常
- 黑马程序员——abstract
- 黑马程序员——final
- 程序员如何尽快变的稍微专业一点
- 黑马程序员——多态
- 黑马程序员——构造函数
- 一位前辈工程师职业发展的忠告
- 黑马程序员——私有private
- 如何做个好员工(转载)
- ——黑马程序员——OC中Foundation框架NSString用法总结
- 黑马程序员--IO(一)--概述、字符流、字节流、流操作规律
- 转:女程序员的微博
- 成为专业程序员的6个技巧