![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
my_learning_road
这个作者很懒,什么都没留下…
展开
-
二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的二维数组和一个整数,判断数组中是否含有该整数。思考:这个问题看似复杂,但是我们可以从一个具体的例子入手,找到解决问题的规律: 首先选取数组右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找...原创 2018-02-26 13:19:03 · 149 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述题目一:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。题目二:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析 针对题目一,不要求调整后的数组奇数和偶数的相对位...原创 2018-03-20 17:36:09 · 162 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。题目分析 看到这个问题,第一反应可能是每次压入一个新元素进栈时,将栈里所有的元素排序,让最小元素位于栈顶,这样就能在O(1)时间得到最小元素。但是这种思路不能保证最后压入栈的元素能够最先出栈,此时的结构已经不是栈了。 我们接着想到...原创 2018-03-25 11:57:19 · 162 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路分析 解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字...原创 2018-03-25 14:46:36 · 155 阅读 · 0 评论 -
链表倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如,一个链表有6个结点,从头结点开始他们的值依次是1、2、3、4、5、6,则倒数第3个结点是4。链表结点定义如下:/* public class ListNode { int val; ListNode next = null; ListNode...原创 2018-03-21 13:42:16 · 138 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路分析 这道题实际上考察的就是二叉树的层次遍历。以下图(来自《剑指offer》)为例进行分析: 因为按层打印的顺序决定应该先打印根结点,所以我们从树的根结点开始分析。为了接下来能够打印值为9的结点的两个子结点,我们应该在遍历到该结点的时候把值为6和10的两个结点保存到一个容器里,现在容器内就有两个结点了。按...原创 2018-03-25 16:17:28 · 647 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。如下图。思路分析 首先需要明白二叉搜索树也是一种排序的数据结构,它的中序遍历就是一个不递减的顺序排列,所以如果要转换成一个排序好的双向链表,那么仅需要改变原来指向左子节点和右子节点的指针,让他们分别指向前节点和后节点即可:原先指向左子节点的指针调整为链表中指向前一...原创 2018-03-31 19:20:55 · 91 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路分析 首先我们需要知道什么是二叉搜索树?二叉搜索树,是一种特殊的二叉树,其每一个父节点的值都大于等于左孩子节点,且小于等于右孩子节点。具体有关二叉搜索树的理解以及各种操作。 我们以两个数组为例来分析这道题目。 ...原创 2018-03-26 14:57:36 · 182 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路分析 如下图,输入二叉树和整数22,则打印出两条路径,第一条路径包含结点10,12,第二条路径包含的结点为10,5,7。 以图中的二叉树为例分析,由于路径是从根节点出发到叶结点,也就是说路径是以根节点为起始点,因此i我们...原创 2018-03-27 20:48:55 · 142 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。思路分析 方法1: 复制原始链表上的每一个结点,并通过pNext连接起来;然后再设置每个结点的pSibling指针。 假设原始链表中某...原创 2018-03-29 09:50:31 · 113 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.题目思路 当我们遇到一个复杂问题的时候,可以用图形来帮助我们思考。由于是以从外圈...原创 2018-03-24 14:21:29 · 259 阅读 · 1 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路分析 ...原创 2018-03-24 11:42:10 · 106 阅读 · 0 评论 -
二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路: 看到问题我们可以很快形成一个基本思路:先判断整数二进制表示中的最右边1位是不是1,接着把输入的整数右移一位,此时原来处于从右边数起的第二位移到最右边了,再判断是不是1。这样每次移动一位,直到整数变为0为止。现在题目变成如何判断一个整数最右边是不是1了:只要把整数和1做位与运算,如果结果为1则表示该整数最右边...原创 2018-03-14 13:25:05 · 142 阅读 · 0 评论 -
从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。链表定义如下:/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/解题思路: ...原创 2018-03-06 20:20:11 · 153 阅读 · 0 评论 -
替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。题目思考:首先想到原来一个空格字符,替换之后变成了三个字符,因此字符串会变长。1.如果在原来的字符串上做替换,则有可能覆盖修改在该字符串后面的内存。2.如果是创建新的字符串并在新的字符串上做替换,那么我们可以直接分配足够多的内存。假设要求我们在原来的字符...原创 2018-03-01 15:28:17 · 127 阅读 · 0 评论 -
重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二叉树结点定义如下:/** * Definition for binary tree * public class TreeNode { * ...原创 2018-03-09 20:02:40 · 112 阅读 · 0 评论 -
旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路分析: 这道题最直观的解法并不难,从头到尾遍历数组一次即可找到最小元素,时间复杂度为O(n),...原创 2018-03-12 11:41:19 · 2879 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。题目分析 这道题目看似简单,很多人都可以在30秒就写出传统的代码,如下:public double powerWithExponent(double base,int exponent){ double result = 1.0; ...原创 2018-03-19 11:03:43 · 122 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,输出该链表中倒数第k个结点。思路分析: 为了反转一个链表,需要调整链表中指针的方向。为了将调整指针这个复杂的过程分析清楚,我们可以接触图形来直观分析。如下图(取自《剑指offer》插图),h、i、j是3个相邻的结点。假设经过若干操作,我们已经把结点h之前的指针调整完毕,这些结点的next都指向前面的一个结点,接下来,我们把i的next指向h,此时链表结构如下图b所...原创 2018-03-23 11:07:47 · 128 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路分析 要查找树A中是否存在树B可以分成两步:第一步在树A中找到和B的根节点的值一样的结点R,第二步再判断以树A中以R为根结点的子树是不是包含和树B一样的结构。 第一步在树A中查找与根节点的值一样的点,实际上就是树的遍历,由于递归的代码比较简单,我们采用递归的方式遍历。...原创 2018-03-23 13:47:43 · 110 阅读 · 0 评论 -
斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39思路分析: 这道题目对大家来说应该都不陌生,第一种能想到的解决方案就是用递归实现。但是用递归实现的方法,会需要多次计算重复的数值,而且随着n的增大而急剧增加。改进递归方法的很简单,我们只要想办法避免重复计算就可以了,最简单的办法是从下往上计算,首先根据Ff(0)和f(1)计算得到f(2),...原创 2018-03-14 10:41:37 · 181 阅读 · 0 评论 -
在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。思路: 在单向链表中删除一个结点,最常规的做法是从链表头结点开始,顺序遍历查找要删除的结点的前一个结点,然后把要删除的结点的next赋给要删除的结点的前一个结点的next即可完成。但是这种思路由于要顺序查找,时间复杂度为O(n)。 那是否一定需要得到被删除的结点的前一个结点呢?当然不是!我们...原创 2018-03-20 14:42:52 · 281 阅读 · 0 评论 -
序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 思路 先序遍历二叉树,如果遇到空节点,就在str的末尾加上“#,”,“#”表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,“,”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上“3,”。 反序列化 所谓反序列化是根据一个字符串重新建立一棵二叉树,反序列化是序列化的逆过程,对于一个字符串,首...原创 2018-09-04 18:40:03 · 199 阅读 · 0 评论