本篇延续上一篇,介绍《剑指offer》第二版中的四个题目:从尾到头打印链表、用两个栈实现队列、旋转数组的最小数字、二进制中1的个数。

5、从尾到头打印链表

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

解答:这里提供两种方式:用栈和递归。
        第一种方式,用栈。因为单向链表一般在表头插入一个新元素,最早插入的会在链表表尾,新插入的会在链表表头。如果是从头到尾(正向)打印一个链表会很容易,直接从头结点开始一步步往表尾打印即可;而反过来从尾到头(反向)打印就没那么容易了,因为表尾元素不容易得到。
        栈是一种后进先出的线性表,我们可以用栈来解决这个问题。先将链表元素从头到尾压入一个栈中,这样链表表尾的元素会在栈顶的位置,然后依次出栈,即可将链表元素从尾到头打印出来。

代码如下:
      

第二种方式,递归。递归在本质上就是一个栈结构,因此可以用递归实现。要实现反向输出链表,每访问一个结点的时候,先递归地输出其后面的结点,再输出该节点自身,这样链表元素的输出顺序就反过来了。代码如下:
     

可以看到基于递归方式的代码看起来很简洁,但可能会产生一个问题:当链表非常长的时候,就会导致方法调用的层级很深,从而可能导致方法调用的栈溢出。因此推荐第一种方式。

6、用两个栈实现队列

题目:
        用两个栈实现一个队列。请实现它的两个方法appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
        解答:
        栈是一种“后进先出”数据结构,而队列是一种“先进先出”的数据结构。本题整体思路是先用一个栈存放在队列尾部插入的结点,在队列头部删除结点时,将第一个栈中元素全部出栈并压入第二个栈中,然后第二个栈出栈,这样就能实现队列“先进先出”的特点。
        定义两个栈:stack1和stack2。stack1存放在队列尾部插入的结点,因此appendTail方法中只会涉及对stack1的入栈操作。在队列头部删除结点时,将stack1中的元素全部出栈并压入stack2中,然后stack2出栈操作。因此deleteHead方法涉及stack1的出栈、stack2的入栈、stack2的出栈三个主要操作。每次删除结点时都要先判断stack2是否为空,如果不为空则直接stack2出栈,为空时则stack1出栈并且stack2入栈。代码如下:

7、旋转数组的最小数字

题目:
        把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
        解答:
        本题最直接的方法是从头到尾遍历数组,找出其最小元素,这种方式的时间复杂度为O(n)。这是一种方式,但这种方式只是单纯地从头到尾遍历数组,并没有利用旋转数组的特性。
        有没有更好的方式呢?我们注意到旋转之后的数组可以分为两个排序的子数组,前面子数组元素都大于或等于后面子数组元素,最小元素正好是两个子数组的分界线。在已排序的数组中,可以用二分法查找元素,时间复杂度为O(logn),本题数组在一定程度上是排序的,因此可以尝试用二分法来寻找最小元素。
        设置两个索引i和j来分别指向数组的第一个元素和最后一个元素位置,再用一个索引mid来指向数组中间的元素位置。接下来进行判断,如果mid位置元素大于i位置元素,则说明mid位置在前一个子数组中,最小元素应该在mid和j之间,因此令i=mid,这样查找范围缩小了一半;如果mid位置元素小于j位置元素,则说明mid位置在后一个子数组中,最小元素应该在i和mid之间,因此令j=mid,查找范围又缩小了一半……以此类推,直到i和j位置相邻(即j-i==1),此时j位置元素就是最小元素。
        此外还有两种特殊情况:第一种是元素已经有序,此时直接输出第一个元素即可;第二种情况是存在重复元素,即i、j、mid位置元素相等,此时只能从头到尾遍历数组查找。
        代码:

8、二进制中1的个数

题目:
        请实现一个方法,输入一个整数,输出该数二进制表示中1的个数。例如9的二进制表示是1001,有2个1,因此如果输入数字9,则方法输出2。
        解答:
        把一个整数减去1,都是把其二进制中最右边的1变成0,如果它右边还有0,则所有0都变成1,而它左边的所有数字都保持不变。例如将12的二进制数1100减去1之后,变成了1011。而将其减去1之后的二进制数与它自身进行按位“与”运算(&),结果变成了1000,即1100&1011==1000,就相当于把1100最右边的数字1变成了0。
        基于上面的规律,得出结论:把一个整数减去1,再与原整数进行按位“与”(&)运算,会把该整数二进制中最右边的1变成0。因此一个整数的二进制中有多少个1,就可以进行多少次这样的运算,直到所有1都变成0,统计出运算次数就是1的个数。
        代码:

转载请注明出处 http://www.cnblogs.com/Y-oung/p/8877901.html

工作、学习、交流或有任何疑问,请联系邮箱:yy1340128046@163.com  微信:yy1340128046

剑指offer题目系列二的更多相关文章

  1. 剑指offer题目系列三(链表相关题目)

    本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...

  2. 剑指offer题目系列一

    本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺 ...

  3. 剑指offer自学系列(二)

    题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的 ...

  4. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 + 二叉排序树 + 最近公共祖先

    剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 Offer_68_1 题目描述 方法一:迭代法 由于该题的二叉树属于排序二叉树,所以相对较简单. 只需要判断两个结点是否在根节点的左右子树中 ...

  5. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  6. 代码题 — 剑指offer题目、总结

    剑指offer题目总结:  https://www.cnblogs.com/dingxiaoqiang/category/1117681.html 版权归作者所有,任何形式转载请联系作者.作者:马孔多 ...

  7. 再来五道剑指offer题目

    再来五道剑指offer题目 6.旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  8. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

    剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q ...

  9. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

随机推荐

  1. php nginx 获取header信息

    nginx中可能没有getallheaders函数 因此编写新函数 function NginxGetAllHeaders(){//获取请求头 $headers = []; foreach ($_SE ...

  2. 再学UML-深入浅出UML类图(三)

    类与类之间的关系(2)       2. 依赖关系  依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系. ...

  3. 11GR2 双节点RAC 配置单节点DG

    只记录主要步骤,供大家参考: RAC 搭建单节点 DG 1 修改源数据库开启归档和force loggingalter system set shared_servers=0; alter datab ...

  4. 关于simotion建立同步/解除同步的问题

    关于simotion建立同步/解除同步的问题. 问题: [enable gearing][disable gearing][enable camming][disable camming]都是一个过程 ...

  5. WIN7系统程序放在中文文件夹打开报错及界面汉字变乱码

    今天发现在一个服务商提供的设备的WIN7系统里,一个稳定运行的程序打开时报错,且界面汉字变乱码. 经测试发现程序放在英文名称的文件夹中可以正常打开,但界面上的汉字仍为乱码. 后检查“控制面板“--”区 ...

  6. 【图文详解】Zookeeper集群搭建(CentOs6.3)

    Zookeeper简介: Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务的. A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程 ...

  7. SONA Topology

    N多年以前就有有人设计传了一种类似“房子”状结构的拓扑图,在Cisco的文档中可以查到这种叫SONA.这是个非常神奇的设计,适合用于中小型网络,之所以这么讲,是因为在这个结构下,但凡任何一台接入层或者 ...

  8. ACM-ICPC(10/21)

    写一发后缀数组套路题,看起来简单,写起来要人命哦~~~ 总共13题. 分两天debug吧,有点累了~~~ suffix(后缀数组的应用) sa[i] :排名第 i 的后缀在哪(i 从 1 开始) ra ...

  9. html常见元素和理解

    html常见元素分为两类,一类是header区的元素,一类是body区的元素 header区元素: meta title style link scipt base 里面包括像meta,title,s ...

  10. Doubly Linked List

    Doubly Linked List Your task is to implement a double linked list. Write a program which performs th ...