您的位置:首页 > 职场人生

记录几道面试题留着之后看

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.htm

3, 如何实现malloc 和 free

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: