记录几道面试题留着之后看
2011-08-25 16:24
330 查看
1, 面试题之链表问题 - 判断单链表是否有环?
给定一个单链表:如何判断单链表是否有环?
如何找出环的连接点在哪里?
如何知道环的长度?
答案:
使用追赶的方法,很容易得到环的存在性结论。能够解决问题1。记下碰撞点P。
从碰撞点P重新开始追赶操作,再次碰撞。中间经过的操作数就是环长。解决问题3。
分别从碰撞点P和链表头,同步地步进扫描,直到碰撞。此次碰撞点就是链表连接点。解决问题2。
问题2的证明如下:
链表形状类似数字 6 。
假设甩尾(在环外)长度为 a(结点个数),环内长度为 b 。
则总长度(也是总结点数)为 a+b 。
从头开始,0 base 编号。
将第 i 步访问的结点用 S(i) 表示。i = 0, 1 ...
当 i<a 时,S(i)=i ;
当 i≥a 时,S(i)=a+(i-a)%b 。
分析追赶过程。
两个指针分别前进,假定经过 x 步后,碰撞。则有:S(x)=S(2x)
由环的周期性有:2x=tb+x 。得到 x=tb 。
另,碰撞时,必须在环内,不可能在甩尾段,有 x>=a 。
连接点为从起点走 a 步,即 S(a)。
S(a) = S(tb+a) = S(x+a)。
得到结论:从碰撞点 x 前进 a 步即为连接点。
根据假设易知 S(a-1) 在甩尾段,S(a) 在环上,而 S(x+a) 必然在环上。所以可以发生碰撞。
而,同为前进 a 步,同为连接点,所以必然发生碰撞。
综上,从 x 点和从起点同步前进,第一个碰撞点就是连接点。
2, Catalan数的相关问题。
http://baike.baidu.com/view/1154333.htm3, 如何实现malloc 和 free
相关文章推荐
- 面试题记录第二节——(service、Broadcast)
- JavaScript this几道面试题及介绍
- 面试题记录第七节——(事件分发)
- 笔试面试题记录(0x01) —— #define
- 几道面试题解析
- 几道php基础面试题
- 几道关于cocos2dx的面试题
- 今天遇到这样一个面试题,在此记录一下
- PHP之几道面试题
- 几道微软编程面试题
- github在git push之后不记录Contributions
- 关于JVM的几道面试题
- google的几道面试题
- java基础知识记录--Java web部分(摘自张孝祥整理java面试题)
- 几道经典C语言面试题
- 看 “安装pidgin-webkit,让pidgin闪亮登场” 这个之后记录
- 几道面试题的求解
- 面试题的记录
- 一道淘宝的面试题,记录分享下~
- 记录一些前端面试题(带答案)