腾讯,百度笔面试经验

腾讯 百度 游戏 网易 华为

面试完毕,已跟网易游戏签约。遂敲一份笔经面经,记录下面试经过。类似于用日记记录自己,同时希望对师弟师妹有一定帮助。不是炫耀,只是希望攒RP,希望各位不要鄙视我。
正所谓饮水思源
小弟来自广州华南理工大学,计算机科学与工程学院。给华工计算机打一个广告吧,呵呵。。。

腾讯(2011 4)(所报职位:后台开发工程师深圳)
腾讯是我一直准备的公司,所以对笔试的知识点及面试侧重点有一定的了解。
@
笔试
一份2个小时卷子,挺基础的,具体什么题记不清楚了。涉及网络原理,c/c++语言基础及高级机制,基础数据结构及算法,数据库,linux基础,linux下可执行文件组织机制(内存布局,.text,.bss,.data组织方式等)。
因为一直在准备,所以这份卷子答起来,相对比较顺利。成绩有80+,这个为通过实习面试起决定性作用。
今天笔试卷子可以勾选bussinessunit(BU),果断勾选B3(互动娱乐)
@
一面
我习惯面试带简历(因为希望面试官多注重自己的项目经验,少问些算法,体现下自己优势吧),见到一面面试官,直接双手递上一份简历。果然面试官对着简历开始问,看着简历中写到的技能一项项问。
  c++
问了多态实现机制(这个问题屡次被面试官问),直接把insightc++ object models书里面的内存布局图搬上去,面试官非常满意。
  tcp/ip
原理,问了TCP状态变迁图,TCP/IP接受发送缓冲区相关概念。
  
Unix环境编程、网络编程问的较多,不过都是Apue,Unp上面的,从容应答。
  linux kernel,
问了一些内核源码相关的概念,问得广而浅,不难回答。
几个综合问题,1 QQ飞车新用户注册时,如何判断新注册名字是否已存在?(数量级:几亿)
2
编写高效服务器程序,需考虑的因素?
3 Epoll
机制相关概念(EpollSelect机制区别),这个概念许多面试官都会问起
一面答得不错,加上笔试成绩不错。面试官当场说了一些表扬的话,并把他QQ留给我,说以后什么事直接咨询他。我知道自己肯定过了,后面面试走流程吧。^_^
@
二面
一个和蔼的大叔,35-45岁,一直在笑。从简历开始,介绍技能,介绍项目经验,对笔试时的系统设计题做改进优化,随便说了下自己想法。
@HR

随便聊天。
拿到腾讯实习Offer,并在腾讯暑期实习两个月。

二、百度(2011/10) (所报职位:软件研发工程师深圳)

对百度的面试一直很犹豫,不知是否应该参加。主要两个原因,一是腾讯已通过实习拿到Offer,二是觉得自己算法很差,怕被鄙视。直至考试前一天,都没有确定是否应该参加。幸运地是,最终克服自己的害怕,走上了百度的笔试考场,有机会体会百度的面试。
面度的笔试卷子,因部门而异。我报的软件研发,RD-3的卷子。
@
笔试
笔试题回忆版
一简答题(30)
1 对远程linux/unix系统进行远程操作,通常的途径是采用终端软件通过ssh登陆远程系统进行操作,但是在网络发生中断时,Linux/unix端运行的程序将会中断。
请阐述这种问题发生的原理、通过何种路径可以避免这种问题、以及阐述可避免这种问题发生途径的原理
2
最小堆插入,删除编程实现。
3
不知所云。
二算法与程序设计(40)(算法可以使用伪代码描述)
4
给定一个数字编码N,大多数情况下可以找到一个数字编码M,其位数与N相同,各位数字之和与N的各位数字之和相同。并且M是大于N的数值中最小的一个,也可能M不存在。
如:N=134,M=143.N=020,M=101。形式化表述为F(N)=M。如果M不存在,则F(N)=-1
要求给定算法计算F(N)序列。
5
给定序列s={a1,a2,…,an};1)构造算法求全排列。2)构造算法求所有组合。
系统设计题(40)
这个有时间再慢慢回忆吧。
这个笔试可以用超烂来形容,勉强40分(后面面试时,卷子上见到)。笔试当天是星期日,当晚手机没电,充电开机后有两个未接020-*。因为其他童鞋都是短信通知,所以没太在意,自己没收到短信通知,很清楚笔试没过,遂决定霸面。
星期一:霸面,霸终端研发深圳,见到面试官,但面试官一直忙于找我笔试成绩,我就一直推销自己,项目经验如何,linux如何,内核如何,TCP/IP网络如何,嵌入式开发如何。终于面试官问了几个小题,写了几个编程之美上面的小题。答的还可以,但因为霸面,他一直不爽我。
这次霸面非常失败,自己也备受打击。
失落的星期一夜晚,无意中又收到020-*的电话,接起来,对方告知是百度公司,通知星期二去一面。
星期二:哥今天是有通知来一面,不是霸面了。NND
一面:设计数据结构及改进。我做的不好,我坦言数据结构及算法一般,因为自己忙项目,但项目经验及linux,网络知识较丰富。遂转问linux及内核源码,tcp/ip原理及实现细节。
他拿着笔记本上网查问题,我压力大啊。问题广而深,幸好linux掌握的还可以。
记起来的问题有,linux操作系统作用,内存管理在源码哪个目录(mm),说些进程调度内核实现大致机制,TCP/IP接收发送缓冲区,内存管理实现机制。又对项目提问题,要求优化。
面试快结束时,面试官直言我数据结构及算法掌握的不熟练,以后希望强化。虽然知道这可能意味被淘汰,但还是特别感谢他,遂说了N多谢谢,但都是真心的。因为对比他和霸面的面试官。
星期二晚上一直没通知,我等到12点就睡了。失望,绝望。虽面试时知道自己可能被淘汰,但仍不愿接受这个事实,但现在不得不接受,带着遗憾入梦。
星期三晚上,没有期待的时候,不经意又是百度的通知。那一刻,死里逃生,我想尖叫。
星期四:二面:两个算法都是编程之美的。其他就是linux、内核,网络、项目,高效服务器,如何预防攻击等题目,发挥的不错。面试官一直微笑。我知道三面有了。
星期五:三面:万幸不问算法,问意向,项目经验,项目细节及能否优化,linux内核等。因为项目确实是自己完成的,所以答的还不错。
星期日:收到Offer通知。但职位是北京的研发。

三、华为:(所报职位:操作系统工程师深圳)
@
机试
给一个数组,求数组中比平均数大的数字个数。
这题是在考我们的编程能力吗?b汗。
@
一面
主要就项目问。
@
二面
群面。技术,非技术总16人,分两组,讨论曹操,刘备,孙权,诸葛亮,谁适合当总经理。这个环节,技术的一直被动。Finally,我们组淘汰了两个(都是技术)
@
三面
上机性格测试,104题。这个没听说刷人的。
@
四面
跟两个老男人随便聊,聊项目,聊未来方向,聊华为操作系统发展,聊linux操作系统及实现,很广但很浅。

四、网易游戏面试游戏系统架构师
@
笔试 10.22
网易游戏笔试,三个小时的题,题量还是非常大的,设计计算机各们核心课程,操作系统原理,c/c++,基础数据结构与算法,数学推理题,网络等。题特别多,题特别杂,几乎没有童鞋做完吧。多多益善吧。经历过考研,一些基础课程还是蛮扎实,前40分的题答的不错,后面的算法题做的一般,我只会最笨重的方法。
@
一面 10.24晚上通知11.1下午2点面试
最次给各位同学提个醒,简历一定要多带几份,以备不时之需。他要求2份,我带了5份,份份都起作用了。
通知2点面试,1:50签到,开始做题,矩阵相乘,差不多10分钟做完。开始等一面。
大概240通知一面,2个面试官。要求先自我介绍,其次问了一个项目,之后问了一句你是哪里人?你目前拿到哪些公司offer?之后一面结束,不足10分钟。没问任何技术,偶是相当不淡定。
@
二面 11.1晚上通知11.2下午3点面试
2
点半左右到网易准备。大概310分,一个女人带我进面试房间。当时紧张了,这是我的第一个女技术面试官?
进去后,21女。面试官先自我介绍,1个大话西游II主程序,1个天下II主程序,靓女姐姐是HR。二面+HR面一起面的。
问了很多c++高级机制,问了2道基础算法吧。题目回忆如下:
1 
构造函数可以调用虚函数吗?语法上通过吗?语义上可以通过吗?
2
析构函数可以抛出异常吗?为什么不能抛出异常?除了资源泄露,还有其他需考虑的因素吗?
3 c++
中类型转换机制?各适用什么环境?dynamic_cast转换失败时,会出现什么情况?(对指针,返回NULL.对引用,抛出bad_cast异常)
4
洗牌算法,如何证明算法是随机的
100万个32位整数,如何最快找到中位数。能保证每个数是唯一的,如何实现O(N)算法?
这道题是编程之美或编程珠玑上的。
这道题使用位图,需要空间复杂度是512M。
6问了一个他们感兴趣的项目,关于gcc插件的,聊了比较久。
7
拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?

说明:

当一个类含有一些数据成员,你需要在实例化类的时候就初始化这些成员,你就需要自己定义构造函数。例如Person类含有m_strName成员,你在声明该类是就将其赋值 Person myPerson("张三")对于拷贝构造函数,为了防止浅拷贝造成的两个对象指向同一内存,当删除其中一个对象后导致另一对象指向内容为空的时候,我们就需要定义自己的拷贝构造函数来进行深拷贝。当你的类数据成员中使用了动态分配的内存,你就需要定义自己的析构函数来释放这部分内存,防止内存泄露。
系统定义的默认构造函数和析构函数函数名和类名相同,如Person类:
Person()构造函数
~Person()析构函数

8 一些题目记不清楚了。
9
聊待遇。
@签约  11 . 2晚上收到通过面试通知,通知 11 . 3下午4点签约。
网易游戏不同部门不同职位不同面试面试内容不同,但都注重基础知识。还有的一面题目是BFS,这个应该特别容易了,但还有一些童鞋完成的不好。

如果各位师弟师妹,如果觉得此贴对你们有点点帮助,就祝福下我吧,帮我攒点RP吧,多谢。
关于书单,列表如下:
一直准备的是腾讯后台开发,所以针对性很强,难免有偏见,望见谅。
先贴下腾讯后台开发要求的技能,这些技能要求是我读书的指南针。
游戏开发类
后台开发工程师返回 >>
职位描述:
负责游戏相关后台系统的开发和设计。
1
职位要求:
1
Unix/Linux 操作系统下的 C/C++ 项目的 2 年以上开发经验;  
2
熟悉网络编程;熟悉 Linux 下的 mysql 开发;  
3
精通 TCP/IP 协议及编程,熟悉互联网应用协议;  
4
、熟悉面向对象的大型分布式系统设计与开发,了解中间件的技术以及基于中间件的开发模式;
5
、全面的软件知识结构 ( 操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全 )
6
具备良好的分析解决问题能力,能独立承担任务和有系统进度把控能力;
7
责任心强,良好的对外沟通和团队协作能力,主动,好学。
有以下经验者优先考虑:  
1
、大型分布式系统设计开发经验;  
2
、游戏后台系统开发经验。

这其中大部分书都是研 1 下,研 2 上购买的。大部分已读完。一部分书反复读 3 遍以上。比如 apue,unp,tcp/ip v 1 等。
重点圈几本推荐下:( * 号书籍 强烈推荐)
c/c++:
初级 c 语言解惑 /C 和指针
专家: C 专家编程 *
c++ primer/effictive c++/inside c++ *
tcp/ip
书籍
tcp/ip v1(tcp/ip
详解 I) *** 2/3 没必要买,也没必要看 , 这本卷 1 主要将 tcp/ip 原理
unp ***
这本主要将 linux socket 编程 API, 两本结合看,效果最佳
unp2(unix
网络编程第 2 ) 这本主要讲 IPC ,有时间可以看看
linux
书籍 :
apue ***
深入理解 linux 内核 *
其他系列 linux 源码书籍,适量看即可。
应试算法及智力题:
编程之美、编程珠玑
海量数据处理:
这个网上收集资料,或者有时间我传上来。
数据结构:
数据结构与算法分析 -C 语言描述 Weiss *
考研数据结构 1 800 红色题集 (这本书对于向我这种数据结构基础薄弱的童鞋,帮助很大)
差点没忘了 2 本至牛的书籍:
汇编语言程序设计(毫不夸张的说,这本书改变了我)

深入理解计算机系统

其他的没什么了,这些书都掌握了,足够了, O 了。
我对嵌入式开发蛮感兴趣的,所以上面 photo 中也包含部分嵌入式书籍,不感兴趣的可以忽略。
最后,谈一谈广研和深圳腾讯的一点面试感受。
广研:
笔试: 6 小题,设计基础数据结构:链表,树,字符串。很基础,但也很考验 C 语言功底。不要说你会,要熟练,要确保你写的代码无误且编程风格优美。这样才能增加筹码。保证你后面顺利通过。
一面:讲解笔试卷子解题思想,讲解项目。面试过程很随意,面试官主要侧重 linux,c++, 网络。
二面:谈一谈项目,就项目问一些问题。问一些他们实际中遇到的问题,你会如何解决? 也是比较随意。
腾讯深圳:
笔试: 数据结构、 tcp/ip 、操作系统、计算机底层机制 ( 包括堆栈如何组织等, apue 有讲 ) 20 个多选,每题 3 分,多选少选不得分。 40 分大题。每空 4 分, 1 0 空。大题基本是送分的。
这个笔试我得了 82 分, 42+40,  RAID 磁盘阵列, b /b+ 树,堆,几个问题没把握,错了 6 个选择题。
82
分,一面面试官说算不错的分数了。
一面: 可能因为笔试成绩不错,所以面试过程比较顺利。 2 页的简历,他只看了第 1 页的 1 /2 ,其它的都没看。
就我简历所列技能问了几个问题 ,tcp/ip 状态转换, socket api ,高性能游戏服务器需要考虑哪些瓶颈,我主要就 tcp/ip 回答的,比如三次握手队列,数据接受 / 发送缓冲区等。 linux 也问了几个 proc 机制及作用,我直接跟他谈 ls /proc 内核如何生成结果,这 proc 个是 件系统源码所谈,他比较满意。你使用的 IPC 及比较?   epoll 模型及优缺点?(这个年年必考)主要有 3 点,对应于 select 3 个缺点: 1   连接数受限 2 查找配对速度慢 3 数据由内核拷贝到用户态。 C++ 主要问动态如何实现。直接画内存布局,既 inside c++ 所讲,面试官还是比较满意。还问了一些大数量的问题。由于之前准备过,所以答的还不错。

一面过程中,面试管多次提到他对我非常满意,我也适当的表达了实习后会留职。他把Q号留给我,说以后有什么事,就在Q上联系他。那一刻,我就知,我应该可以去实习了。呵呵
二面:比较随意,自己讲项目。讲完项目,还有点时间,就着笔试附加题问了些问题。后又结合QQ相册问了些比较难的问题,勉强答了几个。
hr
面:是我所有面试中最惨的一次,由于之前浩哥面hr很随意,所以我就没准备了,因为有一些其他事要做。中午没睡好,4点去面,头晕晕的。被hr问的好惨。主要是谈人生。有几个问题答的不好:你是一个什么样的人?你到底是一个什么样的人?MD,这让我想起另一个极品恶心的女人,所以这2个问题没有发挥好。


百度核心研发面试经验

第一面

自我介绍,项目介绍。。。毕设做的是多核并行计算,问了很多细节的技术问题,包括硬件模型,内存使用,并行算法,多线程调度等等等等,大概20分钟
技术方面:

  • memcpy代码实现,问了各种问题,包括strcpy,区域重叠,void指针的含义,(char *)是怎么实现的,const修饰符的含义,返回值的问题,最后还问到内存的某些东西,反正扯的小问题比较多(最后扯得有点远,大概20分钟)
  • 找寻二叉树中两个节点的公共父节点中最近的那个节点 
    要求: 
    • 每个节点只有value,p_left和p_right指针 
    • 不能用额外的空间 
    • 不能用每个节点的index来找寻父节点的index
      (当时的原话是这么说的,这个大概25分钟,最开始不限制额外空间,说了算法,然后不是面试官想要的,限制了不能用额外空间,然后又想了个说了下,貌似还不是,无奈放弃了,面试官GG不给答案,进行下一个题目)
  • 3 四个开关,对应四盏灯,进屋一次,要求判断出这四盏灯对应的开关 要求: 额,有条件要求,但是是你来提问,面试官回答这个条件可不可以 (这算智力题么?还好貌似没被这个BS,这道题目10分钟) 向面试官提问:大概3分钟 (p.s一面面试时间1个小时多点,问的东西还是偏基础一些)

第二面

自我介绍:对照着简历顺便问了一下学过的课程和编程方面的信息。项目介绍: 介绍自己做的印象最深的项目,遇到的问题,怎么解决的,学到了什么,还能如何进行改善,如果你再做一次的话,会如何去做。。(大概就这么多,感觉很随意了,这部分大概20分钟)

技术方面:

  • 手写程序,输入一个N*N的矩阵,对角线输出每个元素,大概意思如下:  比如输入4*4的矩阵 
    { 
       0, 1, 2, 3,
       4, 5, 6, 7,
       8, 9,10,11,
      12,13,14,15
      } 

      输出为 0,1,4,2,5,8,3,6,9,12…

  • 100亿?(忘记具体多少了,反正很大)数据,无序,有符号,随机,对于给定的一个数X,能不能找到数据中是否存在Y,使得X+Y = K(K给定),还是分了几种情况来问的:1.不限定额外空间和内存,要求时间复杂度尽可能低,设计算法实现。2 限定内存为500M/50M,不限定额外空间,要求时间复杂度尽可能低,设计算法实现。3.尽可能用少的额外空间,但是要保证一定低的时间复杂度,设计算法实现。这部分总共时间大概有40分钟左右,个人感觉二面不像一面那样问很多细节信息,面试问题主要是在算法设计方面 向面试官提问:大概3分钟(p.s二面面试时间正好1个小时,不知道是不是面试官在看着时间,面试官人很和善,给我倒了一杯水,还拿了几张白纸,内牛满面) 

第三面

5月7号(笔试是这个时间吧)到6月2号,战线拉了有将近一个月,今天算是终面了,呼一口气。 出了个小插曲,是一位姐姐把我领进去的,然后我还以为最后的面试官是位女士,到了楼上才知到,原来今天是部门经理面。今天就穿的比较随意,小慌了一下。 面试官哥哥人特别温柔,给人很沉稳干练的感觉(这是传说中的气场么?) 最后面完了面试官哥哥竟然对我说了句谢谢,当时脑子一下子就短路了,高层竟然能这样随和,连连向对方表示感谢,在这里衷心祝愿那位哥哥工作顺心顺意。

自我介绍和项目介绍都省了 看到我的简历有百度产品设计大赛的内容,然后聊了大概有20分钟, 我真的曾一度以为这就是传说中的人生面,but。。 现实就是现实,题目只有两个:

  • 1 开放性题目:10万个目标合作企业 ,10亿个URL地址,问如何选出其中最有商业价值的1亿个URL,进行广告投放,题目信息就这么多,然后你自己思考,需要考虑哪些因素,面试官哥哥会告诉你现实能不能满足这些条件,感觉很像是工作中遇到的问题,因为是开放性问题,可能就没有什么答案,在这个问题上交流了20多分钟,就像是聊天,完全按照自己的感觉来说的 。
  • 2 设计算法,给定数组,寻找和最大的子数列,要求时间复杂度最低
腾讯实习生面试总结

笔试

感觉笔试挺不正规的,可能是由于参加的人太多了吧,我那个教室基本上坐满了,而且大家互相挨着,很容易就能看到别人的答案。

题型:30道不定项选择题,两道程序填空题,附加题。时间为2个小时。

不定项选择题

考的内容非常广泛,包括但不限定于以下内容:计算机体系结构(32位系统和64位系统的区别)、操作系统(内存和cache)、数据结构(由二叉树的中序和后序遍历推出前序遍历结果)、算法(快排第一遍的结果;哪些排序是稳定性排序)、编译原理(操作系统,静态数据区,程序区,堆栈区在内存中的顺序)、计算机网络(服务器收到FIN后处于什么状态)。

 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。

程序填空题

(1) 给出一个数n,其中包含1,2,3,4这4个数字,写一个函数,输出n的某个变化数(重新排列n中的数字),使它能够被7整除。

(2) 删除列表中的节点。

附加题

分C/C++,JAVA,PHP,JAVASCRIPT方向,选做,不算入总分。

  1. C/C++方向

    有N个大小为G的存储单元,用户在不断上传数据,每次上传数据的大小v是随机的,请写一个系统,把上传的数据分配给各个存储单元,使得每个存储单元的使用率和写负责相对均衡,要考虑以下两个初始状态:
    (1) 每个存储单元的剩余空间相同。
    (2) 每个存储单元的剩余空间相差很大。

  2. JAVA方向

    (1) 模拟线程间通信:线程A和B共用一块空间C[] space, 模拟一次线程间的通信:线程A生产一个C物品,并把它放入space中,线程B从space中取出该物品,并输出它的信息。

    (2) 现有某人A与别人的QQ聊天记录(其中不包含A自己说的话),请写一个程序,快速找出与A联系得最频繁的人B。已知B的记录占整个记录的一半以上。

  3. PHP方向

    (1) 编程实现随机取出PHP字符串中的一个字符,至少写出两种以上的方法。

    (2) 是PHP本身是没有方法重载的,请编程实现方法重载。

一面

上午笔试,晚上就通知一面,腾讯效率还挺高的。

一面在皇冠酒店的宴会厅,我被安排在下午一点。参加一面的人还是挺多的,整个宴会厅摆满了四人桌,每桌上都有一个面试官,对面试者进行一对一面试。

我的面试官很nice,见面还问我吃了午饭没,简单寒暄后就开始问技术问题了。

  1. shell读文件并把文件的内容输出到控制台
    1
    2
    3
    4
    
    while read line
    do
        echo $line
    done < $file
    
  2. 某文件的第二列内容为数字,请用awk求出这些数字的和
    1
    
    awk 'BEGIN{sum = 0;} {sum += $2;} END{print sum;}' $file
    
  3. 按层次遍历二叉树

    要点:使用队列

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    void layerOrder(BTree *tree)
    {
        if (tree == NULL)
            return;
    
        queue<BTree *> q;
        q.push(tree);
        
        BTree *p = NULL;
        while (!q.empty())
        {
            p = q.front();
            visit(p);
            
            q.pop();
            if (p->lchild != NULL)
                q.push(p->lchild);
            if (p->rchild != NULL)
                q.push(p->rchild);
        }
    }
    
  4. 统计10万个单词中出现频率最高的1000个

    10万个单词完全可以内存中放下,所以可以使用hashmap,单词作为key,value为该单词的计数,对这10万个单词进行统计。统计完后,用一个最小堆找出计数最多的那1000个单词。具体可参考码农的Top K算法详细解析。

  5. 求1000亿个数中的最大1000个

    假设内存为4G,显然不足以把这1000亿个数都存入。

    可以把这它们划分为落干个区间,对应地存储到若干个文件中,使得每个区间中不超过10亿个数,若超过则对该区间再进行划分。

    然后对这些区间内的数进行统计,假设前N个区间中数的总数X1,且X1<1000,而前N+1个区间中数的总数为X2,且X2>1000,则最大1000个数为前N个区间内的数加上第N+1个区间中的前1000-X1个数。

  6. gdb调试时如何找到出错的地方
  7. 写一个函数void strrev(char *str)反转str
  8. 自定义数据结构,并写函数删除单向链表中值为n的那个结点
  9. 在两个有序数组中找出共有元素

    若已知同一个数组中没有重复的元素,则可以使用归并排序,然后在排序后的结果查找重复元素。若同一数组中可能存在重复元素,则不能使用归并排序。

    另一个方法是使用bitmap,先扫描数组A,把其中出现的元素在bitmap中赋值为1,然后扫描数组B,若某元素在bitmap中已为1,则输出该元素。


=========================================================

1. C++多态实现机制?
2. TCP/IP状态变迁图 TCP/IP 接受发送缓冲区相关概念?
3. 编高效服务器程序需要考虑的因素?
4. Epoll机制相关概念?与select 机制区别?
5. 进程调度内核实现大致机制?
6. 如何预防攻击?
7. 构造函数可以调用虚函数吗?语法上通过吗?语义上通过吗?
8. 析构函数可以调用抛出异常吗?为什么不能抛出异常?除了资源泄漏还有其他需要考虑的因素吗?
9. C++中 类型转换机制、各适应什么环境?
10. 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?
11. proc机制及作用?

=========================================================

数据结构+算法面试100题~~~摘自CSDN,作者July

1.把二元查找树转变成排序的双向链表(树)
 题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
   10
  / /
  6  14
 / / / /
4  8 12 16
 转换成双向链表
4=6=8=10=12=14=16。
 
 首先我们定义的二元查找树 节点的数据结构如下:
 struct BSTreeNode
{
  int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node
};

 
2.设计包含min函数的栈(栈)
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。

  
3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

 

4.在二元树中找出和为某一值的所有路径(树)

题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
  10  
  / /   
 5  12   
 /   /   
4     7
则打印出两条路径:10, 12和10, 5, 7。

二元树节点的数据结构定义为:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};

 

5.查找最小的k个元素(数组)
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

  
第6题(数组)
腾讯面试题: 
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 
要求下排每个数都是先前上排那十个数在下排出现的次数。 
上排的十个数如下: 
【0,1,2,3,4,5,6,7,8,9】

举一个例子, 
数值: 0,1,2,3,4,5,6,7,8,9 
分配: 6,2,1,0,0,0,1,0,0,0 
0在下排出现了6次,1在下排出现了2次, 
2在下排出现了1次,3在下排出现了0次.... 
以此类推..


第7题(链表)
微软亚院之编程判断俩个链表是否相交
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。

问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?

 
第8题(算法)
此贴选一些 比较怪的题,,由于其中题目本身与算法关系不大,仅考考思维。特此并作一题。
1.有两个房间,一间房里有三盏灯,另一间房有控制着三盏灯的三个开关,

这两个房间是 分割开的,从一间里不能看到另一间的情况。
现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。
有什么办法呢?

2.你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。
如果你只能将金条切割两次,你怎样分给这些工人?

3. ★用一种算法来颠倒一个链接表的顺序。现在在不用递归式的情况下做一遍。
  ★用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。
  ★用一种算法整理一个数组。你为什么选择这种方法?
  ★用一种算法使通用字符串相匹配。
  ★颠倒一个字符串。优化速度。优化空间。
  ★颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,

实现速度最快,移动最少。
  ★找到一个子字符串。优化速度。优化空间。
  ★比较两个字符串,用O(n)时间和恒量空间。
   ★假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现 两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不 用这种方式的算法吗?
  ★不用乘法或加法增加8倍。现在用同样的方法增加7倍。

 


第9题(树)
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

         8
      /  /
     6    10
    / /  / /
   5  7 9  11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

 

第10题(字符串)
翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。

句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

 
第11题(树)
求二叉树中节点的最大距离...

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。

 

第12题(语法)
题目:求1+2+…+n,
要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。

 

第13题(链表):
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
链表结点定义如下:  
struct ListNode
{
  int m_nKey;
  ListNode* m_pNext;
};

 

第14题(数组):
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

 

第15题(树):
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。  
例如输入:
  8
  / /
  6 10
 // //
5 7 9 11

输出:
   8
  / /
 10 6
 // //
11 9 7 5

定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
  int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node
};

 

第16题(树):
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。  
例如输入

   8
  / /
 6 10
/ / / /
5 7 9 11

输出8 6 10 5 7 9 11。

 

第17题(字符串):
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。  
分析:这道题是2006年google的一道笔试题。

 


第18题(数组):
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
July:我想,这个题目,不少人已经 见识过了。

 


第19题(数组、递归):
题目:定义Fibonacci数列如下:  
  / 0 n=0
f(n)= 1 n=1
  / f(n-1)+f(n-2) n=2

输入n,用最快的方法求该数列的第n项。
分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。
因此很多程序员对这道题的递归解法非常熟悉,但....呵呵,你知道的。。

 

第20题(字符串):
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串"345",则输出整数345。

 

第21题(数组)
2010年中兴面试题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.

 

第22题(推理):
有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,
A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,
A说不知道,B说不知道,C说不知道,然后A说知道了。
请教如何推理,A是怎么知道的。
如果用程序,又怎么实现呢?

 
第23题(算法):
用最简单,最快速的方法计算出下面这个圆形是否和正方形相交。"  
3D坐标系 原点(0.0,0.0,0.0)
圆形:
半径r = 3.0
圆心o = (*.*, 0.0, *.*)

正方形:
4个角坐标;  
1:(*.*, 0.0, *.*)
2:(*.*, 0.0, *.*)
3:(*.*, 0.0, *.*)
4:(*.*, 0.0, *.*)

 

第24题(链表):
链表操作,单链表就地逆置,
 

第25题(字符串):
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出连续最长的数字串,并把这个串的长度返回,
并把这个最长数字串付给其中一个函数参数outputstr所指内存。
例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,
outputstr所指的值为123456789

 

26.左旋转字符串(字符串)

题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。

 

27.跳台阶问题(递归)
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。
求总共有多少总跳法,并分析算法的时间复杂度。

这道题最近经常出现,包括MicroStrategy等比较重视算法的公司
都曾先后选用过个这道题作为面试题或者笔试题。

 

28.整数的二进制表示中1的个数(运算)
题目:输入一个整数,求该整数的二进制表达中有多少个1。
例如输入10,由于其二进制表示为1010,有两个1,因此输出2。

分析:
这是一道很基本的考查位运算的面试题。
包括微软在内的很多公司都曾采用过这道题。

 
29.栈的push、pop序列(栈)
题目:输入两个整数序列。其中一个序列表示栈的push顺序,
判断另一个序列有没有可能是对应的pop顺序。
为了简单起见,我们假设push序列的任意两个整数都是不相等的。 

比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
因为可以有如下的push和pop序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的pop序列就是4、5、3、2、1。
但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。

 
30.在从1到n的正数中1出现的次数(数组)
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题。

 

31.华为面试题(搜索):
一类似于蜂窝的结构的图,进行搜索最短路径(要求5分钟)

 

32.(数组、规划)
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:  
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];

 
33.(字符串)
实现一个挺高级的字符匹配算法:
给一串很长字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3这些都要找出来
其实就是类似一些和谐系统。。。。。

 
34.(队列)
实现一个队列。
队列的应用场景为:
一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列

 
35.(矩阵)
求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码

 
第36题-40题(有些题目搜集于CSDN上的网友,已标明):
36.引用自网友:longzuo(运算)
谷歌笔试:
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,
存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。

所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,
比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......
胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,
下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名

编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result[n],
求出result。

 

37.(字符串)
有n个长为m+1的字符串,
如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,
问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。

 

38.(算法)
百度面试:
1.用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x次天平,
最多可以从y个小球中找出较轻的那个,求y与x的关系式。

2.有一个很大很大的输入流,大到没有存储器可以将其存储下来,
而且只输入一次,如何从这个输入流中随机取得m个记录。

3.大量的URL字符串,如何从中去除重复的,优化时间空间复杂度

 
39.(树、图、算法)
网易有道笔试:
(1).
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2).
求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,
有向图不再连通,描述算法。

 

40.百度研发笔试题(栈、算法)
引用自:zp155334877
1)设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。

2)一串首尾相连的珠子(m个),有N种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
并分析时间复杂度与空间复杂度。

3)设计一个系统处理词语搭配问题,比如说 中国 和人民可以搭配,
则中国人民 人民中国都有效。要求:

  *系统每秒的查询数量可能上千次;
  *词语的数量级为10W;
  *每个词至多可以与1W个词搭配

当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。


41.求固晶机的晶元查找程序(匹配、算法)
晶元盘由数目不详的大小一样的晶元组成,晶元并不一定全布满晶元盘,

照相机每次这能匹配一个晶元,如匹配过,则拾取该晶元,
若匹配不过,照相机则按测好的晶元间距移到下一个位置。
求遍历晶元盘的算法 求思路。

 

42.请修改append函数,利用这个函数实现(链表):

两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5
另外只能输出结果,不能修改两个链表的数据。

 

43.递归和非递归俩种方法实现二叉树的前序遍历。

 

44.腾讯面试题(算法):
1.设计一个魔方(六面)的程序。
2.有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。
请用5分钟时间,找出重复出现最多的前10条。

3.收藏了1万条url,现在给你一条url,如何找出相似的url。(面试官不解释何为相似)

 

45.雅虎(运算、矩阵):
1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)

某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; 
  {3,6}{2,4,3} m=2
  {3,3}{2,4}{6} m=3 所以m的最大值为3

 


46.搜狐(运算):
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())


47.创新工场(算法):
求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}

 

48.微软(运算):
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。

 

49.一道看上去很吓人的算法面试题(排序、算法):
如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

 

50.网易有道笔试(sorry,与第39题重复):
1.求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

2.求一个有向连通图的割点,割点的定义是,
如果除去此节点和与其相关的边,有向图不再连通,描述算法。
-------------------------------------------------------------------


51.和为n连续正数序列(数组)。
题目:输入一个正数n,输出所有和为n连续正数序列。

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
分析:这是网易的一道面试题。

 


52.二元树的深度(树)。

题目:输入一棵二元树的根结点,求该树的深度。

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

例如:输入二元树:
                                            10
                                          /     /
                                        6        14
                                      /         /   /
                                    4         12     16

输出该树的深度3。

二元树的结点定义如下:

struct SBinaryTreeNode // a node of the binary tree
{
      int               m_nValue; // value of node
      SBinaryTreeNode  *m_pLeft;  // left child of node
      SBinaryTreeNode  *m_pRight; // right child of node
};
分析:这道题本质上还是考查二元树的遍历。

 

53.字符串的排列(字符串)。
题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串
abc、acb、bac、bca、cab和cba。

分析:这是一道很好的考查对递归理解的编程题,
因此在过去一年中频繁出现在各大公司的面试、笔试题中。

 

54.调整数组顺序使奇数位于偶数前面(数组)。

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,
所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

 

55.(语法)
题目:类CMyString的声明如下:
class CMyString
{
public:
      CMyString(char* pData = NULL);
      CMyString(const CMyString& str);
      ~CMyString(void);
      CMyString& operator = (const CMyString& str);

private:
      char* m_pData;
};
请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。

 

56.最长公共字串(算法、字符串)。

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,

则字符串一称之为字符串二的子串。

注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。

例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,
则输出它们的长度4,并打印任意一个子串。

分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,

因此一些重视算法的公司像MicroStrategy都把它当作面试题。

 


57.用俩个栈实现队列(栈、队列)。

题目:某队列的声明如下:

template<typename T> class CQueue
{
public:
      CQueue() {}
      ~CQueue() {}

      void appendTail(const T& node);  // append a element to tail
      void deleteHead();               // remove a element from head

private:
     T> m_stack1;
     T> m_stack2;
};

分析:从上面的类的声明中,我们发现在队列中有两个栈。
因此这道题实质上是要求我们用两个栈来实现一个队列。
相信大家对栈和队列的基本性质都非常了解了:栈是一种后入先出的数据容器,
因此对队列进行的插入和删除操作都是在栈顶上进行;队列是一种先入先出的数据容器,
我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。

 


58.从尾到头输出链表(链表)。

题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{

      int       m_nKey;
      ListNode* m_pNext;
};
分析:这是一道很有意思的面试题。
该题以及它的变体经常出现在各大公司的面试、笔试题中。

 


59.不能被继承的类(语法)。
题目:用C++设计一个不能被继承的类。

分析:这是Adobe公司2007年校园招聘的最新笔试题。
这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。

 

 

60.在O(1)时间内删除链表结点(链表、算法)。

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:

struct ListNode

{

      int        m_nKey;

      ListNode*  m_pNext;

};

函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,

更重要的是,还能考察我们对时间复杂度的理解。
-------------------------------------------------------------------------

 

61.找出数组中两个只出现一次的数字(数组)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

分析:这是一道很新颖的关于位运算的面试题。

 


62.找出链表的第一个公共结点(链表)。
题目:两个单向链表,找出它们的第一个公共结点。

链表的结点定义为:
struct ListNode

{

      int         m_nKey;

      ListNode*   m_pNext;

};

分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,
因此在微软的面试题中,链表出现的概率相当高。

 


63.在字符串中删除特定的字符(字符串)。
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

例如,输入”They are students.”和”aeiou”,

则删除之后的第一个字符串变成”Thy r stdnts.”。

分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,
因为写程序操作字符串能很好的反映我们的编程基本功。

 


64. 寻找丑数(运算)。
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,
但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。
求按从小到大的顺序的第1500个丑数。

分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。

 


65.输出1到最大的N位数(运算)
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,

则输出1、2、3一直到最大的3位数即999。
分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。

 

66.颠倒栈(栈)。
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。
颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。


 

67.俩个闲玩娱乐(运算)。

1.扑克牌的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。

2.n个骰子的点数。
把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,
打印出S的所有可能的值出现的概率。

 


68.把数组排成最小的数(数组、算法)。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32,  321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。

分析:这是09年6月份百度的一道面试题,
从这道题我们可以看出百度对应聘者在算法方面有很高的要求。

 


69.旋转数组中的最小元素(数组、算法)。
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,

输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

    分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,
时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。

 


70.给出一个函数来输出一个字符串的所有排列(经典字符串问题)。
ANSWER 简单的回溯就可以实现了。当然排列的产生也有很多种算法,去看看组合数学,

还有逆序生成排列和一些不需要递归生成排列的方法。
印象中Knuth的<TAOCP>第一卷里面深入讲了排列的生成。这些算法的理解需要一定的数学功底,
也需要一定的灵感,有兴趣最好看看。

 


71.数值的整数次方(数字、运算)。

题目:实现函数double Power(double base, int exponent),求base的exponent次方。
不需要考虑溢出。

分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码:
double Power(double base, int exponent)
{

      double result = 1.0;
      for(int i = 1; i <= exponent; ++i)
            result *= base;
      return result;
}

 

 

72.(语法)
题目:设计一个类,我们只能生成该类的一个实例。
分析:只能生成一个实例的类是实现了Singleton模式的类型。

 

 
73.对称字符串的最大长度(字符串)。

题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。

分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。

 


74.数组中超过出现次数超过一半的数字(数组)

题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

分析:这是一道广为流传的面试题,包括百度、微软和Google在内的多家公司都
曾经采用过这个题目。要几十分钟的时间里很好地解答这道题,
除了较好的编程能力之外,还需要较快的反应和较强的逻辑思维能力。

 

 

75.二叉树两个结点的最低共同父结点(树)
题目:二叉树的结点定义如下:
struct TreeNode
{

    int m_nvalue;
    TreeNode* m_pLeft;
    TreeNode* m_pRight;
};

输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。

 


76.复杂链表的复制(链表、算法)

题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,
还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:
 struct ComplexNode
{
    int m_nValue;
    ComplexNode* m_pNext;
    ComplexNode* m_pSibling;
};

下图是一个含有5个结点的该类型复杂链表。
图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,
指向NULL的指针没有画出。

腾讯,百度笔面试经验_第1张图片                                 
请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。 
分析:在常见的数据结构上稍加变化,这是一种很新颖的面试题。
要在不到一个小时的时间里解决这种类型的题目,我们需要较快的反应能力,
对数据结构透彻的理解以及扎实的编程功底。

 

 


77.关于链表问题的面试题目如下(链表):

1.给定单链表,检测是否有环。
 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,
说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。

 

2.给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。

        如果head1==head2,那么显然相交,直接返回head1。
否则,分别从head1,head2开始遍历两个链表获得其长度len1与len2,假设len1>=len2,
那么指针p1由head1开始向后移动len1-len2步,指针p2=head2,
下面p1、p2每次向后前进一步并比较p1p2是否相等,如果相等即返回该结点,
否则说明两个链表没有交点。


3.给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点。
        运用题一,我们可以检查链表中是否有环。
        如果有环,那么p1p2重合点p必然在环中。从p点断开环,
方法为:p1=p, p2=p->next, p->next=NULL。此时,原单链表可以看作两条单链表,
一条从head开始,另一条从p2开始,于是运用题二的方法,我们找到它们的第一个交点即为所求。


4.只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。
 办法很简单,首先是放p中数据,然后将p->next的数据copy入p中,接下来删除p->next即可。

5.只给定单链表中某个结点p(非空结点),在p前面插入一个结点。
  办法与前者类似,首先分配一个结点q,将q插入在p后,接下来将p中的数据copy入q中,
然后再将要插入的数据记录在p中。

 

78.链表和数组的区别在哪里(链表、数组)?

分析:主要在基本概念上的理解。
但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生,
谁比较仔细,谁获胜的机会就大。

 
79.(链表、字符串)
1.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
2.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?
3.请编写能直接实现strstr()函数功能的代码。


 

80.阿里巴巴一道笔试题(运算、算法)

问题描述:
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
这个笔试题,很YD,因为把某个递归关系隐藏得很深。

 

先来几组百度的面试题:

===================

81.第1组百度面试题
1.一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],
其左边的数都小于等于它,右边的数都大于等于它。
能否只用一个额外数组和少量其它空间实现。
2.一个文件,内含一千万行字符串,每个字符串在1K以内,
要求找出所有相反的串对,如abc和cba。
3.STL的set用什么实现的?为什么不用hash?

 

82.第2组百度面试题
1.给出两个集合A和B,其中集合A={name},
集合B={age、sex、scholarship、address、...},
要求:
问题1、根据集合A中的name查询出集合B中对应的属性信息;
问题2、根据集合B中的属性信息(单个属性,如age<20等),查询出集合A中对应的name。

2.给出一个文件,里面包含两个字段{url、size},
即url为网址,size为对应网址访问的次数,
要求:
问题1、利用Linux Shell命令或自己设计算法,
查询出url字符串中包含“baidu”子字符串对应的size字段值;
问题2、根据问题1的查询结果,对其按照size由大到小的排列。
(说明:url数据量很大,100亿级以上)

 

83.第3组百度面试题
1.今年百度的一道题目
百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
要求:空间复杂度O(1),时间复杂度为O(n)。

2.百度笔试题
用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。
memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。
分析:
由于可以把任何类型的指针赋给void类型的指针
这个函数主要是实现各种数据类型的拷贝。

 

84.第4组百度面试题
2010年3道百度面试题[相信,你懂其中的含金量]
1.a~z包括大小写与0~9组成的N个数
用最快的方式把其中重复的元素挑出来。
2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,
使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;...,
构造一个发生器,使得它构造1、2、3、...n的概率均为1/n,要求复杂度最低。
3.有10个文件,每个文件1G,
每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。
要求按照query的频度排序.

 

85.又见字符串的问题
1.给出一个函数来复制两个字符串A和B。
字符串A的后几个字节和字符串B的前几个字节重叠。
分析:记住,这种题目往往就是考你对边界的考虑情况。
2.已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,
如果没有返回0,有的话返回子字符串的个数。

 
86.
怎样编写一个程序,把一个有序整数数组放到二叉树中?
分析:本题考察二叉搜索树的建树方法,简单的递归结构。
关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。

而,学会把递归改称非递归也是一种必要的技术。
毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。
但是对某些数学问题,就一定要学会用递归去解决。

 

87.
1.大整数数相乘的问题。(这是2002年在一考研班上遇到的算法题)
2.求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)
3.实现strstr功能,即在父串中寻找子串首次出现的位置。
(笔试中常让面试者实现标准库中的一些函数)

 


88.2005年11月金山笔试题。编码完成下面的处理函数。
函数将字符串中的字符'*'移到串的前部分,

前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。
如原始串为:ab**cd**e*12,
处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)

 

89.神州数码、华为、东软笔试题
1.2005年11月15日华为软件研发笔试题。实现一单链表的逆转。
2.编码实现字符串转整型的函数(实现函数atoi的功能),据说是神州数码笔试题。如将字符
串 ”+123”123, ”-0123”-123, “123CS45”123, “123.45CS”123, “CS123.45”0
3.快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)
4.删除字符串中的数字并压缩字符串。
如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。
(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N))
5.求两个串中的第一个最长子串(神州数码以前试题)。
如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"。

 


90.
1.不开辟用于交换数据的临时空间,如何完成字符串的逆序
(在技术一轮面试中,有些面试官会这样问)。
2.删除串中指定的字符
(做此题时,千万不要开辟新空间,否则面试官可能认为你不适合做嵌入式开发)
3.判断单链表中是否存在环。

 

91.
1.一道著名的毒酒问题
有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。
现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。
2.有趣的石头问题
有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,
把配对的石头和木头找出来。

 

 

92.
1.多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。
如果说,前面的人比后面的人高(两人身高一样认为是合适的),
那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:
176, 178, 180, 170, 171
这些捣乱分子对为
<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>, 
那么,现在给出一个整型序列,请找出这些捣乱分子对的个数(仅给出捣乱分子对的数目即可,不用具体的对)

要求:
输入:
为一个文件(in),文件的每一行为一个序列。序列全为数字,数字间用”,”分隔。
输出:
为一个文件(out),每行为一个数字,表示捣乱分子的对数。

详细说明自己的解题思路,说明自己实现的一些关键点。
并给出实现的代码 ,并分析时间复杂度。
限制:
输入每行的最大数字个数为100000个,数字最长为6位。程序无内存使用限制。

 

93.在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到i的最小的数,

一个解答:这需要两次遍历,然后再遍历一次原数组,
将所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。

给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。

 

94.微软笔试题
求随机数构成的数组中找到长度大于=3的最长的等差数列9 d- x' W) w9 ?" o3 b0 R
输出等差数列由小到大: 
如果没有符合条件的就输出
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
要求时间复杂度,空间复杂度尽量小

 

95.华为面试题
1 判断一字符串是不是对称的,如:abccba
2.用递归的方法判断整数组a[N]是不是升序排列

 

96.08年中兴校园招聘笔试题
1.编写strcpy 函数
已知strcpy 函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请
编写函数 strcpy

 


最后压轴之戏,终结此微软等100题系列V0.1版。
那就,
连续来几组微软公司的面试题,让你一次爽个够:
======================
97.第1组微软较简单的算法面试题
1.编写反转字符串的程序,要求优化速度、优化空间。 
2.在链表里如何发现循环链接?
3.编写反转字符串的程序,要求优化速度、优化空间。
4.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 
5.写一个函数,检查字符是否是整数,如果是,返回其整数值。
(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)


98.第2组微软面试题
1.给出一个函数来输出一个字符串的所有排列。
2.请编写实现malloc()内存分配函数功能一样的代码。
3.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。 
4.怎样编写一个程序,把一个有序整数数组放到二叉树中? 
5.怎样从顶部开始逐层打印二叉树结点数据?请编程。 
6.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?


99.第3组微软面试题
1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。
现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。
抓取多少个就可以确定你肯定有两个同一颜色的果冻?(5秒-1分钟) 
3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,
问你如何才能准确称出4公升的水?(40秒-3分钟) 
一个岔路口分别通向诚实国和说谎国。
来了两个人,已知一个是诚实国的,另一个是说谎国的。
诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,
但不知道应该走哪条路,需要问这两个人。请问应该怎么问?(20秒-2分钟)


100.第4组微软面试题,挑战思维极限
1.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。

13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)(5分钟-1小时) 
2.在9个点上画10条直线,要求每条直线上至少有三个点?(3分钟-20分钟) 
3.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?
都分别是什么时间?你怎样算出来的?(5分钟-15分钟)

 

终结附加题:
微软面试题,挑战你的智商
==========
说明:如果你是第一次看到这种题,并且以前从来没有见过类似的题型,
并且能够在半个小时之内做出答案,说明你的智力超常..)
1.第一题 . 五个海盗抢到了100颗宝石,每一颗都一样大小和价值连城。他们决定这么分: 
抽签决定自己的号码(1、2、3、4、5) 
                          
首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,
按照他的方案进行分配,否则将被扔进大海喂鲨鱼 
如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,
当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼。

依此类推 
条件:每个海盗都是很聪明的人,都能很理智地做出判断,从而做出选择。
问题:第一个海盗提出怎样的分配方案才能使自己的收益最大化?

 

2.一道关于飞机加油的问题,已知: 
每个飞机只有一个油箱,  
飞机之间可以相互加油(注意是相互,没有加油机)  
一箱油可供一架飞机绕地球飞半圈, 
问题:
为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?
(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场) 
  //欢迎,关注另外不同的更精彩的100题V0.2版,和此V0.1版的答案等后续内容。

 本微软等面试100题系列V0.1版,完。

======================

更多请参见此100题V0.2版:微软、谷歌、百度等公司经典面试100题[第1-60题]

 

---------------------------------------------------------------------------------    

                 致各位网友

一、关于本微软等100题系列V0.1版的郑重声明       
      http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx

 

二、欢迎,希望,各位网友能更多的、更好的提出你的个人思路、算法,
     思路回复地址:
      本微软等100题系列V0.1版,永久维护地址
     http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html 
     谢谢。

 

三、目前前60题的答案参考早已公布上传,第61-100题的答案在整理中。

所有的资源下载(题目+答案)地址:  

      http://v_july_v.download.csdn.net/

 

四、而后,请大家务必尊重本人近2个月的劳动成果。不论你是引用我帖子上,博客上,
还是各资源上的题目或答案,
      凡是以July为名发表的博客、帖子,资源,引用都请注明作者本人July及出处。
      若私自据为己有者,不标明出处及作者本人,必究。
      永远,向您的厚道,致以最崇高的敬意。

 

五、目前,针对本100题系列,我已建一个100题永久讨论组(后面的朋友加Algorithms_4群,见博客公告栏内。)
      专门针对这100题各个版本中任何一道题进行讨论、交流、维护、修正。
     //预计本微软等面试100题系列V0.2版,相信,会在明年2011年与大家见面,具体待定。

 

六、一切的详情,还是在本博客里。欢迎,永久关注,此博客。

      本博客致力于数据结构之法、算法优化之道 

      请参见本人博客:
     My Blog:  
     http://blog.csdn.net/v_JULY_v 
     谢谢,各位。
=====

欢迎,任何人,就以上任何内容,题目与答案思路,或其它任何问题、
回复到上述本100题系列永久维护帖子上,或者与我联系:
本人邮箱:
[email protected] 
[email protected]

=================================================

更多请参见此100题V0.2版:微软、谷歌、百度等公司经典面试100题[第1-60题]

  

 

作者声明:
本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July及出处。
向您的厚道致敬。谢谢。二零一零年十二月六日

你可能感兴趣的:(腾讯,百度笔面试经验)