百度第三面失败经历

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,可惜想出来得太晚了。



此次失败的经历暴露出我基础不够扎实的问题,亟需改正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值