2012百度暑期实习生笔试(开发测试)

明天百度面试,而且还是电话面,临时抱一下佛脚,怕被问到笔试题目,只得把题目重新思考,顺便把网上一些好的解答贴出来。

1、给一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么b是a的兄弟单词,比如的单词army和mary互为兄弟单词。 
现在要给出一种解决方案,对于用户输入的单词,根据给定的字典找出输入单词有哪些兄弟单词。请具体说明数据结构和查询流程,要求时间和空间效率尽可能地高。 

我的解法:

多级哈希:把字典中的单词映射到哈希表中,这时假设建立4张哈希表,每张表有26个项(不考虑大写),可以映射一个单词的前四个字母,后面的项直接在集合中查找,即是a{a{a{a{a...z},、b{a...z}、...}...太长了,其实就是集合,像我们查字典那样,先找第一个匹配的字母,然后找第二个,找到差不多就直接在固定的一页顺序查找,我是这么想的,大家有好的方法就说一下啊。查表时间为O(1),故时间复杂度O((n-4)*(n-4)),如果建多个表,时间复杂度就可以下降,不过空间复杂度就要增加,感觉空间复杂度不行。貌似还有什么哈希连接,网上找的http://blog.youkuaiyun.com/yuan22003/article/details/6713240可以优化

别人的做法:第一题,创建一个char array[52](区分大小写)。初始化为0,读取一个单词,每遇到一个字母在相应位置+1。这样可以保证兄弟单词所得的字符串数组是相同的。其实当你加载字典的时候,就可以将兄弟单词放到同一个集合中。 
当查询时只需要计算出单词的array字符串,找到相应集合就即可。(来自http://blog.sina.com.cn/s/blog_5f99444c0101471x.html

2、线程和进程的区别与联系,什么是线程安全?

线程和进程的区别:
1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2、 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3、 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
4、 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。

联系:一个进程至少有一个线程,进程内多个线程并发执行,共享进程分配的资源。进程消失,线程不复存在,线程消失,进程可能还在

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。线程安全问题都是由全局变量及静态变量引起的(来自百度百科)


3、C和C++中如何动态分配和释放内存?他们的区别是什么? 

C free以及 malloc 是函数

c++:new以及 delete 是运算符、

格式不一样。
功能也不同,malloc可以在原来的基础上继续开辟内存。
实例化类时,要调用类中的构造函数,传统的malloc函数无法完成这样的功能,所以只能新增运算符
new   是个操作符,和什么"+","-","="...有一样的地位.   
      
  malloc是个分配内存的函数,供你调用的.   
      
  new是保留字,不需要头文件支持.   
  malloc需要头文件库函数支持.   
    
  new   建立的是一个对象,   
  malloc分配的是一块内存.   
      
  new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间   
  malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.   
算法与程序设计、 
1、网页爬虫在抓取网页时,从指定的URL站点入口开始爬取这个站点上的所有URL link,抓取到下一级link对应的页面后,同样对页面上的link进行抓取从而完成深度遍历。为简化问题,我们假设每个页面上至多只有一个link,如www.baidu.com/a.html链接到www.baidu.com/b.html再链到www.baidu.com/x.html,当爬虫抓取到某个页面时,有可能再链www.baidu.com/b.html,也有可能爬取到一个不带任何link的终极页面。当抓取到相同的URL或不包含任何link的终极页面,即完成爬取。爬虫在抓取到这些页面后建立一个单向链表,用来记录抓取到的页面,如:a.html->b.html->x.html...->NULL。 
问:对于爬虫分别从www.baidu.com/x1.html和www.baidu.com/x2.html两个入口开始获得两个单向链表,得到这两个单向链表后,如何判断他们是否抓取到了相同的URL?(假设页面URL上百亿,存储资源有限,无法用hash方法判断是否包含相同的URL) 
请先描述相应的算法,再给出相应的代码实现。(只需给出判断方法代码,无需爬虫代码)

直接检查两条链表的结尾是否相同就可以了

2、数组al[0,mid-1] 和 al[mid,num-1],都分别有序。将其merge成有序数组al[0,num-1],要求空间复杂度O(1)

以时间换空间,在原空间内做插入排序

系统设计题 
相信大家都使用过百度搜索框的suggestion功能,百度搜索框中的suggestion提示功能如何实现?请给出实现思路和主要的数据结构、算法。有什么优化思路可以使得时间和空间效率最高?

http://topic.youkuaiyun.com/u/20120506/15/58b7c362-3458-48dd-bba6-ed200f3195e5.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值