![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
Handsome-Zan
这个作者很懒,什么都没留下…
展开
-
【剑指 Offer 学习】【面试题 3 : 二维数组中的查找】【思路】
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:对输入的条件进行判断,没有正确输入的话做出提示。矩阵是有序的,从右上角开始看起 如果目标数大于当前数,说明目标数在当前数下方,行数++; 如果目标数小于当前数,说明目标数...原创 2018-07-08 21:57:12 · 163 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 17: 合并两个排序的链表】【思路】
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:递归当前较小节点的下一个结点 代码:package 合并两个排序的链表;class ListNode { int val; ListNode next = null; public ListNode(int val) { this.val = va...原创 2019-01-05 19:29:16 · 149 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 18: 树的子结构】【思路】
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路:若根节点相等,利用递归比较他们的子树是否相等 若根节点不相等,则利用递归分别在左右子树中查找。详见代码,未添加测试用例 代码:package 树的子结构;import javax.sound.midi.Soundbank;/** * 输入两棵二叉树A,...原创 2019-01-06 19:04:49 · 235 阅读 · 2 评论 -
【剑指 Offer 学习】【面试题 14 : 调整数组顺序使奇数位于偶数前面】【思路】
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路:插入排序的思想遍历数组,将遍历的第一个奇数(坐标 i)依次与前一个偶数(坐标 i - 1)对换位置 记录已调整顺序的奇数的个数,后续的遍历,遍历至当前记录值即可 冒泡排序思想待完善 ...原创 2019-01-02 19:35:23 · 105 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 23: 从上往下打印二叉树】【思路】
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路:创建一个动态数组用于存储节点值、方法的返回 参数为空时返回空数组 创建一个队列用于存储未遍历的数组,并将根结点入队 记录当前处理的结点并控制台输出 将根结点存入要返回的数组 将当前结点的左右节点依次保存到队列的结尾(FIFO,先入先出) 代码:package 从上往下打印二叉树23;imp...原创 2019-01-12 15:07:47 · 123 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 19: 二叉树的镜像】【思路】
题目:操作给定的二叉树,将其变换为源二叉树的镜像。 思路:使用递归交换每个节点的左右子树位置。 代码:package 二叉树的镜像;class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.va...原创 2019-01-07 16:08:40 · 107 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 15 : 链表中倒数第K个结点】【思路】
题目:输入一个链表,输出该链表中倒数第k个结点。 思路:制造一把长度为 K 的尺子,尺子的后端走到链表末段,那么尺子的前端就是倒数第 K 个结点 。 代码:package 链表中倒数第K个结点;class ListNode { int val; ListNode next = null; public ListNode(int val) { this...原创 2019-01-03 10:58:03 · 115 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 24: 二叉搜索树的后序遍历序列】【思路】
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路:输入的数组不能为空,并且有数据。 先找到右子树的开始位置,然后分别进行左右子树递归处理。 代码:package 二叉搜索树的后序遍历序列24;import java.util.*;/** * 输入一个整数数组...原创 2019-01-13 21:26:21 · 133 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 20: 顺时针打印矩阵】【思路】
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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-01-08 21:01:40 · 123 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 25: 二叉树中和某一值的路径】【思路】
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 思路:由于路径是从根结点出发到叶结点, 也就是说路径总是以根结点为起始点,因此我们首先需要遍历根结点。在树的前序、中序、后序三种遍历方式中,只有前序遍历是首先访问根结点的。...原创 2019-01-14 21:09:25 · 201 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 21: 包含 min 函数的栈】【思路】
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路:用一个栈 data 保存数据,用另外一个栈 min 保存依次入栈最小的数 比如,data中依次入栈,5, 4, 3, 8, 10, 11, 12, 1 则 min 依次入栈,5, 4, 3,no,no, no, no, 1no 代表此...原创 2019-01-09 21:16:29 · 104 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 22: 栈的压入、弹出序列】【思路】
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路:创建一个栈用于压入弹出元素 遍历第一个序列,依次压入栈 第二个序...原创 2019-01-11 08:25:25 · 105 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 7 : 重建二叉树】【思路】
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路:push 动作都在 stack1 中进行,pop 动作在 stack2 中进行。 边界条件判断,栈为空时,抛出异常。 当 stack2 不为空时,直接 pop; 当 stack2 为空时,先把 stack1 中的元素 pop 出来,push 到 stack2 中,再从 stack...原创 2018-12-25 18:43:48 · 118 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 5 : 从尾到头打印链表】【思路】
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 思路:方案一:(后进先出)遍历链表,再从栈顶开始出个输出结点的值,此时输出的结点的顺序已经反转过来了。1、先推进栈2、再依次取出栈顶元素 方案二:递归。1、判断链表头结点是否为空2、将 next 结点作为下一次的实参3、输出当前栈顶元素缺点:当链表非常长的时候,会导致函数调用的层...原创 2018-09-11 16:54:13 · 139 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 4 : 替换空格】【思路】
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。 思路:遍历的方向两边皆可。 若从后往前遍历,新的字符串需要反转。 用 String 类的方法判断字符串各位置对应的字符是否为空格。 知识点:charAt() 方法: 返回此序列中指定索引处的 char 值...原创 2018-11-11 11:31:57 · 181 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 8 : 旋转数组的最小数字】【思路】
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:使用【二分法】mid = low + (high - low)/2需要考虑三种情况:...原创 2018-12-26 16:28:40 · 120 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 9 : 斐波那契数列】【思路】
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39斐波那契数列:0 1 1 2 3 5 8 13 21 34 55...... 思路:直接使用递归的方法,但是,递归的方法可能会遇到 Stack Overflow。 动态规划的方法:从第 2 项开始自底向上,先用一个变量记录已经计算的斐波那契数列值,再将相...原创 2018-12-27 21:40:34 · 121 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 9 进阶: 跳台阶、变态跳台阶】【思路】
题目(跳台阶):一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 思路:假设现在 6 个台阶,可以从第 5 跳一步到 6,这样的话有多少种方案跳到 5 就有多少种方案跳到 6,另外也可以从 4 跳两步跳到 6,跳到 4 有多少种方案的话,就有多少种方案跳到 6,其他的不能从 3 跳到 6 什么的啦,所以最...原创 2018-12-28 17:07:29 · 189 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 9 进阶 : 矩形覆盖】【思路】
题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法? 思路:依然是【斐波那契数列】当 n = 0 时,return 0;当 n = 1 时,return 1;当 n = 2 时,两个小矩形同时横着或者竖着,return 2;当 n > 2 时,举个栗子:假如 n ...原创 2018-12-29 13:05:28 · 137 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 10 : 二进制中 1 的个数】【思路】
题目:输入一个整数,输出该数二进制表示中1的个数。 思路:如果一个整数不为 0,那么这个整数至少有一位是 1。如果我们把这个整数减 1,那么原来处在整数最右边的 1 就会变为 0,原来在 1 后面的所有的 0 都会变成 1 (如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数 1100,减去 1 后,结果是 1011,第三位变成 0,它后面...原创 2018-12-30 22:39:20 · 110 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 16: 反转链表】【思路】
题目:输入一个链表,反转链表后,输出新链表的表头。 思路:创建 head 节点的 pre 和 preserve_next 用 preserve_next 保存 head 节点的 next 节点,使得单链表不会因为没有 next 节点断裂 将 head 节点指向 next 节点变为指向 pre 节点,单次反转完毕 将 pre、 head、 next 三个节点依次向后移动一个节...原创 2019-01-04 19:46:19 · 154 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 6 : 重建二叉树】【思路】
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:【前序遍历】序列的【第一个节点】是【树的根节点】,由此创建根节点; 从【中序遍历】序列中找到【根节点】的位置,【根节点】的【左边】就...原创 2018-12-25 16:40:16 · 101 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 11 : 数值的整数次方】【思路】
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路:判断底数是否为 0(当两数相差很小时,可以认为相等),指数是否小于 0; 取指数的绝对值计算整数次方,若指数为负,通过【1 / 当前结果】得到负的整数次方; 计算整数次方,使用递归的方法:当 n 为偶数时,a ^ n = a ^ (n / 2) * a ...原创 2018-12-31 11:25:42 · 101 阅读 · 0 评论 -
【剑指 Offer 学习】【面试题 26: 复杂链表的复制】【思路】
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:根据原始链表的每个结点 N 创建对应的 N’ 将复制后的结点接在原结点后原始链表:A -> B -> C -> D -> E...原创 2019-01-15 22:21:01 · 114 阅读 · 0 评论