免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4471 | 回复: 1
打印 上一主题 下一主题

[算法] 今日面试题:乾坤大挪移;及颠倒乾坤的分析 [复制链接]

论坛徽章:
8
巨蟹座
日期:2013-08-12 09:41:40IT运维版块每日发帖之星
日期:2015-12-09 06:20:00寅虎
日期:2013-12-25 14:59:40天秤座
日期:2013-12-06 14:04:55酉鸡
日期:2013-11-28 10:22:22水瓶座
日期:2013-08-26 15:40:54巨蟹座
日期:2013-08-12 09:42:01每日论坛发贴之星
日期:2015-12-09 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-06 09:07 |只看该作者 |倒序浏览

今日面试题:乾坤大挪移


给定一个单向链表,设计一个算法实现链表向右旋转k个位置。K是非负的整数。这题看起来简单,可真编程实现有陷阱啰。


举例:

给定:1->2->3->4->5->6->null 并且k=3,

则有:4->5->6->1->2->3->null



题目:


在一棵二叉搜索树中,有两个节点颠倒了顺序。要求实现一个算法,在不改变树结构的前提下,恢复正确的二叉搜索树。给出一个空间为O(n)的实现很容易,那该如何给出一个空间O(1)的实现呢?


分析:


首席,从一个实例来看,如果两个节点颠倒顺序,会发生什么。


这是一颗正常的BST


              7

             / \

            4   10

           / \    \

          2   6   13

         / \

        1   3

       /

      0


看看几种情况:


假设同一枝上的两个节点相邻颠倒了,比如0和1,那么中序遍历后的结果变成


1,0,2,3,4,6,7,10,13


在这种情况下,显然1和0的顺序不对,那么要交互他们的顺序。


如果同一枝上不相邻的两个节点,比如,1和4呢?


0,4,2,3,1,6,7,10,13


在此情形下,4和2,3和1的顺序不对,这时,需要将前面不对的4,和后面不对的1,交换顺序。


如果是左右枝中的元素呢,比如,2和10


0,1,10,3,4,6,7,2,13


这时,10和3,7和2的顺序不符,这时,需将前面不符的10,和后面不符的2,交换。


再看,如果是根节点参与呢,比如7,和0,


7,1,2,3,4,6,0,10,13


这时7和1,6和0,不符从小到大的顺序,同理,需颠倒7和0。


至此,各种情况我们都考虑了,而且归纳出基本的想法是:


用中序遍历,记录顺序不符的对。如果只有一对元素不符,交换他们;如果有两对不符,那么将第一对中的前一个元素,和第二对中的后一个元素,互换。


如果采用基于递归和堆栈的中序遍历,空间要求会是O(n),显然不符合题意。那么,我们需要寻求能用O(1)空间进行中序遍历的方法。



论坛徽章:
8
巨蟹座
日期:2013-08-12 09:41:40IT运维版块每日发帖之星
日期:2015-12-09 06:20:00寅虎
日期:2013-12-25 14:59:40天秤座
日期:2013-12-06 14:04:55酉鸡
日期:2013-11-28 10:22:22水瓶座
日期:2013-08-26 15:40:54巨蟹座
日期:2013-08-12 09:42:01每日论坛发贴之星
日期:2015-12-09 06:20:00
2 [报告]
发表于 2013-08-06 13:19 |只看该作者
单向链表算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP