百度笔试面试.docx
- 文档编号:9948977
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:17
- 大小:24.41KB
百度笔试面试.docx
《百度笔试面试.docx》由会员分享,可在线阅读,更多相关《百度笔试面试.docx(17页珍藏版)》请在冰豆网上搜索。
XX笔试面试
XX0711月4日网上笔试题及答案(仅供参考)
1编程:
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
2编程:
用C语言实现函数void*memmove(void*dest,constvoid*src,size_tn)。
memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。
3英文拼写纠错:
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。
假设已经有一个包含了正确英文单词的词典,请你设计一个拼写纠错的程序。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度;
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
4寻找热门查询:
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。
一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。
请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度。
5集合合并:
给定一个字符串的集合,格式如:
{aaabbbccc},{bbbddd},{eeefff},{ggg},{dddhhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaabbbcccdddhhh},{eeefff},{ggg}
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
1题
char*revert(char*str)
{
intn=strlen(str);
inti=0;
charc;
for(i=0;i{
c=str;
str=str[n-i];
str[n-i]=c;
}
returnstr;
}
///////////////////////////////////
2题
void*memmove(void*dest,constvoid*src,size_tn)
{
assert((dest!
=0)&&(src!
=0));
char*temp=(char*)dest;
char*ss=(char*)src;
inti=0;
for(;i{
*temp=*ss;
}
returntemp;
}
/////////////////////////////////////////////////
3题
(1)思路:
字典以字母键树组织,在用户输入同时匹配
(2)流程:
每输入一个字母:
沿字典树向下一层,
a)若可以顺利下行,则继续至结束,给出结果;
b)若该处不能匹配,纠错处理,给出拼写建议,继续至a);
算法:
1.在字典中查找单词
字典采用27叉树组织,每个节点对应一个字母,查找就是一个字母
一个字母匹配.算法时间就是单词的长度k.
2.纠错算法
情况:
当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示可能处理方法:
(a)当前字母前缺少了一个字母:
搜索树上两层到当前的匹配作为建议;
(b)当前字母拼写错误:
当前字母的键盘相邻作为提示;(只是简单的描述,可以有更多的)
根据分析字典特征和用户单词已输入部分选择(a),(b)处理
复杂性分析:
影响算法的效率主要是字典的实现与纠错处理
(a)字典的实现已有成熟的算法,改进不大,也不会成为瓶颈;
(b)纠错策略要简单有效,如前述情况,是线性复杂度;
(3)改进
策略选择最是重要,可以采用统计学习的方法改进。
//////////////////////////////////////////////
4题
(1)思路:
用哈希做
(2)首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度(注意值与日志项对应关系)选出前十的频度,取出对应的日志串,简单不过了。
哈希的设计是关键。
//////////////////////////////////////////////////
5题
(1)思路:
先将集合按照大小排列后,优先考虑小的集合是否与大的集合有交集。
有就合并,如果小集合与所有其他集合都没有交集,则独立。
独立的集合在下一轮的比较中不用考虑。
这样就可以尽量减少字符串的比较次数。
当所有集合都独立的时候,就终止。
(2)处理流程:
1.将集合按照大小排序,组成集合合并待处理列表
2.选择最小的集合,找出与之有交集的集合,如果有,合并之;如果无,则与其它集合是独立集合,从待处理列表中删除。
3.重复直到待处理列表为空
算法:
1。
将集合按照大小从小到大排序,组成待处理的集合列表。
2。
取出待处理集合列表中最小的集合,对于集合的每个元素,依次在其他集合中搜索是否有此元素存在:
1>若存在,则将此小集合与大集合合并,并根据大小插入对应的位置。
转3。
2>若不存在,则在该集合中取下一个元素。
如果无下一个元素,即所有元素都不存在于其他集合。
则表明此集合独立,从待处理集合列表中删除。
并加入结果集合列表。
转3。
3。
如果待处理集合列表不为空,转2。
如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。
算法复杂度分析:
假设集合的个数为n,最大的集合元素为m排序的时间复杂度可以达到n*log(n)然后对于元素在其他集合中查找,最坏情况下为(n-1)*m查找一个集合是否与其他集合有交集的最坏情况是m*m*(n-1)合并的时间复杂度不会超过查找集合有交集的最坏情况。
所以最终最坏时间复杂度为O(m*m*n*n)
需要说明的是:
此算法的平均时间复杂度会很低,因为无论是查找还是合并,都是处于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否独立的对象,优先与最大的集合进行比较,这些都最大的回避了最坏情况。
(3)可能的改进:
首先可以实现将每个集合里面的字符串按照字典序进行排列,这样就可以将查找以及合并的效率增高。
另外,可能采取恰当的数据结构也可以将查找以及合并等操作的效率得到提高。
XX笔试题2005
题目大致是这样的:
第一部分选择题:
有几道网络相关的题目,巨简单,比如第一题是TCP、RIP、IP、FTP中哪个协议是传输层的......。
有一道linux的chown使用题目。
其他的全是数据结构的题目!
什么链,表,码的,不知所云.唉,我可以没有学过数据结构的人呐!
真残忍!
这一部分迅速猜完!
第二部分简答题:
1、在linux中如何编译C程序,使之成为可执行文件?
如何调试?
答案:
1)检查程序中.h文件所在的目录,将其加入系统PATH中;
2)执行C编译:
#gcc[源文件名]-o[目标文件名]
执行C++编译:
#g++[源文件名]-o[目标文件名]
3)改变目标文件为可执行文件:
#chmod+x[目标文件名]
4)如需将多个可执行文件连续执行,可生成批处理文件:
#vi[批处理文件名]
可执行文件1
可执行文件2
.........
最后将该批处理文件属性该位可执行。
调试:
在编译时使用-g参数,就可以使用gdb进行调试。
2、写出内存分配和释放的函数,并指出区别。
答案:
C语言的标准内存分配函数:
malloc,calloc,realloc,free等。
malloc与calloc的区别为1块与n块的区别:
malloc调用形式为(类型*)malloc(size):
在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
calloc调用形式为(类型*)calloc(n,size):
在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。
realloc调用形式为(类型*)realloc(*ptr,size):
将ptr内存大小增大到size。
free的调用形式为free(void*ptr):
释放ptr所指向的一块内存空间。
C++中为new/delete函数。
3、写出socket函数,并指出其功能。
socket():
建立socket通信描述符;
bind():
将套接字和机器上的一定的端口关联;
connect():
连接到远程主机;
listen():
使套接字做好连接的准备,规定等待服务请求队列的长度;
accept():
接受连接,一旦有客户端发出连接,accept返回客户地址信息和一个新的sock;
有了这个新的sock,双方就可以开始收发数据:
send()和recv():
用于流式套接字或者数据套接字的通讯;
sendto()和recvfrom():
用于无连接的数据报套接字;
close():
关闭套接字;
shutdown():
选择性的关闭套接字,可以只允许某一方向的通讯关闭;
getpeername():
返回流式套接字时对端peer信息;
gethostname():
返回程序所运行的机器的主机名字;
gethostbyname():
返回本机IP;
第三部分编程题:
1、从文件中读取字符串数据,反序显示并大小写转换。
2、给定26字母表以及对应的密码表,编程实现加密及解密功能。
第四部分思考题(正是传说中的字典纠错题):
用户在输入英文单词时经常出错,现对其进行就错。
给定一个正确的英文词典,考虑纠错实现。
1)指出思路。
2)流程、算法难易程度及可能的改进策略。
一道算法题目答案
intReplace(Stringtype&S,StringtypeT,StringtypeV);//将串S中所有子串T替换为V,并返回置换次数
{
for(n=0,i=1;i〈=Strlen(S)-Strlen(T)+1;i++)//注意i的取值范围
if(!
StrCompare(SubString(S,i,Strlen(T)),T))//找到了与T匹配的子串
{//分别把T的前面和后面部分保存为head和tail
StrAssign(head,SubString(S,1,i-1));
StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));
StrAssign(S,Concat(head,V));
StrAssign(S,Concat(S,tail));//把head,V,tail连接为新串
i+=Strlen(V);//当前指针跳到插入串以后
n++;
}//if
returnn;
}//Replace
分析:
i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:
设S='place',T='ace',V='face',则省掉i+=Strlen(V);运行时会出现什么结果?
(无限递归face)
XX2005年的笔试题
1.实现voiddelete_char(char*str,charch);
把str中所有的ch删掉
2.把字符串S中所有A子串换成B,这个没给函数原型
3.搜索引擎的日志要记录所有查询串,有一千万条查询,不重复的不超过三百万
要统计最热门的10条查询串.内存<1G.字符串长0-255
(1)主要解决思路//具体用词和原题不大一样
(2)算法及其复杂度分析
4.有字典,设计一个英文拼写纠正算法
(1)思想
(2)算法及复杂度(3)改进
5.{aaa,bb,ccc,dd},{bbb,ff},{gg}等一些字符串的集合
要求把交集不为空的集合并起来,如上例会得到{aaa,bb,ccc,dd,ff},{gg}
(1)思想
(2)算法及复杂度(3)改进
2007年XX校园招聘会笔试题
1选错的
基类public成员在派生类中仍是public
基类protected成员在派生类中仍是protected
基类private成员在派生类中是隐藏
回去想的,我忘了错的怎么说的来着
2边长为n的正方形可以分成多个边长为1的正方形,如边长为2的正方形有2×2个边长为1的正方形和1个边长为2的正方形;问边长为5的正方形有几个正方形;
3
publicclassPerson{
publicvoidprintValue(inti,intj){
System.out.println("1111111111111");
}
publicvoidprintValue(inti){
System.out.println("22222222222");
}
}
publicclassTeacherextendsPerson{
publicvoidprintValue(){
System.out.println("333333333");
}
publicvoidprintValue(inti){
System.out.println("4444444444");
}
publicstaticvoidmain(String[]args){
Persont=newTeacher();
t.printValue(10);
}
}
输出结果是:
4444444444
4.找错误
inttolower(constchar*str)
{
if(NULL==str)return0;
inti=0,iCount=0;
for(;i { if(str[i]<='Z'||str[i]>='A') { str[i]+='z'-'Z'; iCount++; } } returniCount; } 5有个长度为12的无重复有序表,按折半查找法进行查找,在表内各元素等概率情况下,查找成功所需的平均比较(三元比较)的次数为() A35/12B37/12C39/12D43/12 6从n个数里面找最大的两个数理论最少需要比较 A2lognB2logn-1Cn+logn-2D2n-3 7386781634*234659874=6(30秒) 8Linux的非root用户,在自己的目录中,不可以删除非空目录dirs的方法是: ArmdirdirsBrm-rdirsCmvdirs/dev/nullDdestroydirs 9Shell运算结果是3的是 Aecho(9/3) Becho$[16/5] Cecho$((10-7)) Decho’21/6’|bc 大题: 1每个整数0-9这10个数组成,如223有2个2,和1个3,输入m和n(0 求出m到n之间所有整数共包含了多少个0,1。 。 。 。 9 实现函数voidfoo(constchar*m,constchar*n,char*result,size_tlen) result为输出缓冲,len为result的长度。 要求写出思路、程序程序效率,计算时间复杂度和空间复杂度 2linux32位系统下有10个无序文件,各文件大小不一(均小于1G)现在需要将此10个文件归并为一组,不超过10个有序文件(第一个文件最大数小于或等于第二个文件最小数,依次类推)请选择你擅长的语言实现说明文件的每一行最大不超过128位的阿拉伯数字组合,每一行只有一个数字,头一位不是零 要求写出思路和程序,计算时间复杂度和空间复杂度 3网页3种操作,查询,删除,最加到末尾 例如: 每页显示20个,现在要查第50页。 假如用有序数组,则从下标20×49开始,直接返回后面20个即可,但是当删除时会有大量数据移动,所以数组对删除效率低,另外一种方法是,不删除只作标记,但是查询时必须又从头开始计数,数一下应该从哪个位开始返回 设计一种数据结构高效率的完成3种功能 限制: 1操作在硬盘上发生 2网页大小不相同 3总数小于10M 4单个小于100K 4数据库方面,不敢兴趣没记,不过看了下,不是很难 2006XX笔试题 一、选择题: 15分共10题 1.一个含有n个顶点和e条边的简单无向图,在其邻接矩阵存储结构中共有____个零元素。 A.e B.2e C.n2-e D.n2-2e 2.____是面向对象程序设计语言中的一种机制。 这种机制实现了方法的定义与具体的对象无关,而对方法的调用则可以关联于具体的对象。 A.继承(Inhertance)B.模板(Template) C.对象的自身引用(Self-Reference)D.动态绑定(DynamicBinding) 3.应用层DNS协议主要用于实现网络服务功能. A.IP地址到网络设备名字的映射B.IP地址到网络硬件地址的映射 C.网络设备名字到IP地址的映射D.网络硬件地址到IP地址的映射 4.linux默认情况下,一个进程最多能打开多少文件? A.64B.128C.512D.1024 5.下面结构体 structs1{ charch,*ptr; union{ shorta,b; unsignedintc: 2,d: 1; } structs1*next; }; 的大小是_____: A.12字节B.16字节C.20字节D.24字节 6.任何一个基于"比较"的内部排序的算法,若对6个元素进行排序,则在最坏情况下所需的比较次数至少为____。 A.10B.11C.21D.36 7.以下不是进程间通讯的是___ A共享内存B信号量C线程局部存储D消息队列 8.下面程序,求count的值 intfunc(x) { intcount=0; x=9999; while(x) { Count++; x=x&(x-1); } returncount; } A8;B10;C5;D11 9.使用malloc系统调用分配的内存是在____上分配的? A栈;Bbss;C物理内存;D堆 10.最坏情况下,合并两个大小为n的已排序数组所需要的比较次数_____ A.2nB.2n-1C.2n+1D.2n-2 二、简答题: 20分,共3题 1.(5分)下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。 for(char*piterator=szWord;*piterator! =0;piterator++) { if(*piterator&0x80! =0) { piterator++; } elseif(*piterator>='A'&&*piterator<='Z') piterator+=32; } 2.(5分)对给定的上亿条无序的url,请按照domain、site以及path分别排序,并请指出排序过程中可能会遇到的哪些问题? 如何提高效率? 例如: Domain: Site: Path: 3.(10分)某型CPU的一级数据缓存大小为16K字节,cache块大小为64字节;二级缓存大小为256K字节,cache块大小为4K字节,采用二路组相联。 经测试,下面两段代码运行时效率差别很大,请分析哪段代码更好,以及可能的原因。 为了进一步提高效率,你还可以采取什么办法? A段代码 intmatrix[1023][15]; constchar*str="thisisastr"; inti,j,tmp,sum=0; tmp=strlen(str); for(i=0;i<1023;i++){ for(j=0;j<15;j++){ sum+=matrix[j]+tmp; } } B段代码 intmatrix[1025][17]; constchar*str="thisisastr"; inti,j,sum=0; for(i=0;i<17;i++){ for(j=0;j<1025;j++){ sum+=matrix[j]+strlen(str); } } 三、编程题: 30分共1题 注意: 要求尽可能提供完整代码,如果可以编译运行酌情加分。 1.内存中有一个长数组,条目数为10万,数组单元为结构体structarray,sizeof(structarray)为512字节。 结构有一int型成员变量weight。 现需要取得按weight值从大到小排序的前500个数组单元,请实现算法,要求效率尽可能高。 四、设计题: 35分共1题 注意: 请尽可能详细描述你的数据结构、系统架构、设计思路等,建议多写一些伪代码或者流程说明。 1.请设计一个字典。 以字符串为索引,存储用户定义的定长结构。 要求有增、删、查、改的功能。 已经给定一个函数,可以由字符串映射到一个签名,每个签名由两个unsignedint类型组成。 假设每一个字符串能够对应唯一的一个签名,完全没有重复(或者重复的概率可以忽略),并且签名分布足够均匀。 请描述你的数据结构? 内存如何申请? 增、删、查、改的功能如何实现? 如果操作很频繁,该如何优化?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 百度 笔试 面试