剑指offer题解
种子选手席同学
这个作者很懒,什么都没留下…
展开
-
[剑指offer] 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数解题思路二维数组是有序的,从右上角来看,向左数字递减,向下数字递增。因此从右上角开始查找,当要查找数字比右上角数字大时,下移;当要查找数字比右上角数字小时,左移;如果出了边界,则说明二维...原创 2019-02-28 15:42:52 · 99 阅读 · 0 评论 -
[剑指offer] 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。参考代码最简单的方法就是把奇数和偶数按顺序挑出来,分别放到vector里,最后再把偶数的vector接到奇数vector的末尾。import java.util.Vector;public class Solu...原创 2019-03-02 15:27:12 · 67 阅读 · 0 评论 -
[剑指offer] 链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针刚好指向倒数第k个节点。关注要点链表头指针是否为空,若为空则直接返回回nullk是否为0,k为0也就...原创 2019-03-02 15:43:35 · 149 阅读 · 0 评论 -
[剑指offer] 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路设置三个指针,head为当前节点,pre为当前节点的前一个节点,next为当前节点的下一个节点,需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2的过程中,用pre让节点反转所指方向,next节点保存next1节点防止链...原创 2019-03-02 16:37:50 · 85 阅读 · 0 评论 -
[剑指offer] 合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路两种解法:递归和非递归参考代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*//...原创 2019-03-02 17:00:37 · 80 阅读 · 0 评论 -
[剑指offer] 丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路判断一个数是不是丑数,最简单的方法就是让这个数不断除以2,3,5。要求第N个丑数,只要从1开始,依次判断每个数是不是丑数,如果是,则相应的序号加1,直到序号为N,就是我们要的丑数了。但是这种方法时...原创 2019-03-05 20:30:30 · 112 阅读 · 0 评论 -
[剑指offer] 树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路递归思想,如果根节点相同则递归调用IsSubtree(),如果根节点不相同,则判断root1的左子树和roo2是否相同,再判断右子树和root2是否相同;注意节点为空的条件,HasSubTree中,只要有树为空就返回false; IsSubtree中,要先判断root2,如果root2...原创 2019-03-02 18:31:00 · 142 阅读 · 0 评论 -
[剑指offer] 二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义: 源二叉树 8 / \ 6 10 / \ / \5 7 9 11镜像二叉树 8 / \ 10 6 / \ / \11 9 7 5解题思路通过对以上两棵树的观察,我们可以总结出这两棵树的根节点相同,但它们的左、右两个子节点交换了位置。所以我...原创 2019-03-02 19:20:37 · 112 阅读 · 0 评论 -
[剑指offer] 顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.解题思路先得到矩阵的行和列数,然后依次旋转打印数据,一次旋转打印结束后,往对角分别前进和后退一个单位。要注意单行和单列的情况...原创 2019-03-02 19:47:00 · 143 阅读 · 0 评论 -
[剑指offer] 包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。解题思路用一个栈stack保存数据,用另外一个栈temp保存依次入栈最小的数比如,stack中依次入栈5, 3, 4, 10, 2, 12, 1, 8则temp依次入栈5, 3, 3,3, 2, 2, 1, 1每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈,否则用最小元素入栈。参考代码...原创 2019-03-02 20:21:46 · 104 阅读 · 0 评论 -
[剑指offer] 栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路模拟堆栈操作的过程,将原数列依次压栈,把栈顶元素与所给出栈队列相比,如果相同则出...原创 2019-03-03 21:04:34 · 90 阅读 · 0 评论 -
[剑指offer] 从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路就是二叉树的层序遍历。借助一个队列就可以实现。使用两个队列一个存放节点,一个存放值。先将根节点加入到队列中,然后遍历队列中的元素,遍历过程中,访问该元素的左右节点,再将左右子节点加入到队列中来。注意Queue创建的方式:Queue queue = new LinkedList();用add将元素添加到队列中,用rem...原创 2019-03-03 21:36:30 · 76 阅读 · 0 评论 -
[剑指offer] 二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路二叉搜索树: 左子树&amp;lt;根&amp;lt;=右子树对于后序遍历来说,序列数组的最后一个元素一定是根节点, 根据这个元素,将前面的数组分为左、右两个部分,左侧部分都比该元素小,右侧部分都比该元素大,如果右侧部分有比该根节点小的元素,那么就不是后...原创 2019-03-03 22:53:19 · 118 阅读 · 0 评论 -
[剑指offer] 二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路用前序遍历的方式访问到某一结点时,把该结点添加到路径上,并用目标值减去该节点的值。如果该结点为叶结点并且目标值减去该节点的值刚好为0,则当前的路径符合要求,我们把加入res数组中。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问...原创 2019-03-04 15:13:08 · 92 阅读 · 0 评论 -
[剑指offer] 复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路参考代码/*public class RandomListNode { int label; RandomListNode next = nu...原创 2019-03-04 16:40:36 · 111 阅读 · 0 评论 -
[剑指offer] 把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路先将数组转换成字符串数组,然后对字符串数组按照规则排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则:若ab > ba 则 a > b若ab < ba 则 a <...原创 2019-03-05 16:54:39 · 117 阅读 · 0 评论 -
[剑指offer] 整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路三种解法:法一:依次遍历每个数,判断每个数里面是否包含1法二...原创 2019-03-05 15:41:11 · 128 阅读 · 0 评论 -
[剑指offer] 替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路很简单,从后往前遍历就对了。参考代码public class Solution { public String replaceSpace(StringBuffer str) { StringB...原创 2019-02-28 16:16:15 · 72 阅读 · 0 评论 -
[剑指offer] 从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路一种方法是利用栈来实现;另外一种方法是利用三个指针把链表反转,关键是 r 指针保存断开的节点。/**public class ListNode { int val; ListNode next = null; ListNode(int val) { ...原创 2019-02-28 16:35:05 · 88 阅读 · 0 评论 -
[剑指offer] 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路我们知道,前序遍历的第一个节点就是树的根节点,所以我们先根据前序遍历序列的第一个数字创建根结点,接下来在中序遍历序列中找到根结点的位置,根节点...原创 2019-02-28 17:04:12 · 120 阅读 · 0 评论 -
[剑指offer] 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路两个栈 stack1 和 stack2:push 动作都在 stack1 中进行,pop 动作在 stack2 中进行。当 stack2 不为空时,直接 pop,当 stack2 为空时,先把 stack1 中的元素 pop 出来,push 到 stack2 中,再从 stack2 中 p...原创 2019-02-28 20:59:35 · 88 阅读 · 0 评论 -
[剑指offer] 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路采用二分查找法。需要考虑三种情况:array[mid] &amp;amp;gt; array[high]:出现这...原创 2019-02-28 21:11:55 · 100 阅读 · 0 评论 -
[剑指offer] 跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路分析这个问题可以先从简单开始考虑,台阶只有1阶,只有1种跳法,台阶有2阶,有2种跳法:一种两次跳一级;另一种一次跳两级。然后考虑一般情况,当有n级台阶时,将f(n)作为总跳法,第1次跳的时候,可以有两种方法:一是跳一级,此时跳法数目等于后面剩下的n-1级台阶的跳法,即f(n-1);二是跳两级...原创 2019-02-28 22:50:55 · 95 阅读 · 0 评论 -
剑指offer—变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。问题分析 由于每次跳的阶数不确定,没有一个固定的规律,但是可以了解的是后一次跳是在前一次跳的结果上累加的,因此我们可以考虑使用递归的方法来解决问题。 那么从递归的三个步骤开始寻找解决方案: 1. 递归截止条件。 由于每次可以跳1-n的任意阶数,因此无论有多少...原创 2019-02-28 22:59:23 · 88 阅读 · 0 评论 -
剑指offer:矩形覆盖
题目表述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路当n=1时,记作F(1), 共有1种方法;当n=2时,记作F(2), 共有两种方法;当n=3时,记作F(3), 分为两种情况:第一次用一个矩形竖着覆盖(左图蓝色),则剩下共有F(n-1)种方法,即F(2) 种方法;第一次用一个矩形横着覆盖(右图...原创 2019-03-01 10:15:55 · 133 阅读 · 0 评论 -
[剑指offer] 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路指数为负时,可以先对指数求绝对值,算出次方的结果后再取倒数当底数为0,指数为负时,会出现对0求倒数情况,要特殊处理0的0次方在数学上没有意义,因此无论输出0还是1都是可以接受的在计算次方的时候,除了简单的遍历,我们可以使用递归的思想,如下公式,来...原创 2019-03-01 11:27:47 · 114 阅读 · 0 评论 -
[剑指offer] 二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路题目可能比较难理解,可以看如下的图,我们有一棵二叉搜索树,要求得右边的双向链表。在二叉搜索树中,左子结点的值总是小于父结点的值,右子节点的值总是大于父结点的值。因此我们在转换成排序双向链表时,原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子...原创 2019-03-04 22:16:32 · 130 阅读 · 0 评论 -
[剑指offer] 字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路刚看题目的时候,可能会觉得这个问题很复杂,不能一下子想出解决方案。那我们就要学会把复杂的问题分解成小问题。我们求整个字符...原创 2019-03-04 23:02:43 · 106 阅读 · 0 评论 -
[剑指offer] 数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路三种解法:法1:借助hashmap存储数组中每个数出现的次数,最后看是否有数字出现次数超过数组长度的一半;法2:排序。数组排序后,如果某个数字出现次数超过数组的长度...原创 2019-03-05 10:21:32 · 170 阅读 · 0 评论 -
[剑指offer] 最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路两种方法:法1:先对数组排序,然后取出前k个法2:利用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。参考代码法1:import java.util.ArrayList;import java.util.Arrays;pu...原创 2019-03-05 11:12:44 · 111 阅读 · 0 评论 -
[剑指offer] 连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度...原创 2019-03-05 15:19:24 · 116 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括’.’和’’的正则表达式。模式中的字符’.’表示任意一个字符,而’’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配解题思路当模式中的第二个字符不是“*”时:1、如果字符串第一个字符和模式中的第一个字符相匹配,那...转载 2019-05-20 22:15:50 · 136 阅读 · 0 评论