
剑指offer刷题
剑指offer刷题笔记
TheManba
You can do anything you want to, if you really want it.
展开
-
剑指 offer 刷题——32. 从上到下打印二叉树
从上到下打印二叉树就是二叉树的层次遍历,又称为二叉树的广度优先搜索(BFS),通常借助队列实现。题目一:不分行从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]提示:节点总数 <= 1000实现:创建一个队列,先将根节点入队;队列不为空时,队首元素出队.原创 2020-08-21 11:20:00 · 143 阅读 · 0 评论 -
剑指 offer 刷题——30. 包含 min 函数的栈
一、题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回原创 2020-08-21 10:49:55 · 130 阅读 · 0 评论 -
剑指 offer 刷题——29. 顺时针打印矩阵
一、题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[i].length <原创 2020-08-20 11:06:40 · 192 阅读 · 0 评论 -
剑指 offer 刷题——27. 二叉树的镜像
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \1 3 6 9镜像输出: 4 / \ 7 2 / \ / \9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 1000思路及代码实现思路:通过示例我们可以看出,二叉树的镜像就是原创 2020-08-20 09:34:25 · 203 阅读 · 0 评论 -
剑指 offer 刷题——25. 合并两个排序的链表
一、题目将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4二、思路及代码实现方法一:迭代(1)若 l1、l2 中有一个为空,则返回另一个链表,即为合并的结果。(2)若 l1、l2 都不为空,比较 l1 和 l2 的值。若 l1 的值小于 l2 的值,则将 l1 添加至合并的链表,并将 l1 的指针后移一个;否则,则将原创 2020-08-18 15:10:54 · 141 阅读 · 0 评论 -
剑指 offer 刷题——24. 反转链表
一、题目反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?二、思路及代码实现方法一:迭代在遍历链表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!代码如下:原创 2020-08-18 14:41:37 · 148 阅读 · 0 评论 -
剑指 offer 刷题——22. 链表中倒数第 k 个节点
一、题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.二、思路及代码实现思路:双指针由于单链表只有从前往后的指针,所以我们只能从头节点往后遍历。假设链表有 n 个节点,那么倒数第 k 个节原创 2020-08-17 21:11:12 · 159 阅读 · 0 评论 -
剑指 offer 刷题——09. 用两个栈实现队列
一、题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","appendTai原创 2020-07-12 10:54:16 · 165 阅读 · 0 评论 -
剑指 offer 刷题——06. 从尾到头打印链表
一、题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000二、思路及代码实现要打印链表,就要遍历链表,而单链表的指针只有指向下一个节点的引用,没有指向前一个节点的引用,所以我们无法通过反向遍历链表来实现从尾到头打印链表。遍历链表的顺序是从头到尾,输出的顺序却是从尾到头,相当于后进先出,自然就想到了借助栈来实现。实现:初始化一个空的栈;遍历链表,把原创 2020-07-08 19:40:01 · 162 阅读 · 0 评论 -
剑指 offer 刷题——03. 数组中重复的数字
一、题目找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000二、思路及代码实现思路一:排序先对数组进行排序使得重复数字位于相邻的位置,再遍历数组,比较每个数字和它下一个位置的数字是否相等,若相等则将该数字原创 2020-07-06 21:27:39 · 281 阅读 · 0 评论 -
剑指 offer 刷题——04. 二维数组中的查找
一、题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、思路方法一:可以使用暴力法,遍历整个数组进行比较,如果找到就返回 true,否则返回 false。方法二:题目中给定的数组有两个特点:每一行都按照从左到右递增的顺序排序;每一列都...原创 2020-04-03 10:12:03 · 216 阅读 · 0 评论 -
剑指 offer 刷题——18(2).删除链表中重复的节点
一、题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5二、思路及代码实现思路:双指针创建双指针 p1、p2,p1 指向当前确定不重复的那个节点,p2 作为工作指针,一直往后面搜索。如果 p2.val = p2.next.val,说明它们就是重复节点,让 p2 指向最后一个重复的节点,执行 p1.next = p2.next原创 2020-08-14 19:29:45 · 159 阅读 · 0 评论 -
剑指 offer 刷题——18(1).删除链表的节点
一、题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4原创 2020-08-10 19:41:22 · 270 阅读 · 0 评论 -
剑指 offer 刷题——15. 二进制中 1 的个数
一、题目请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 0000000原创 2020-07-30 11:46:55 · 232 阅读 · 0 评论 -
剑指 offer 刷题(31)——数组中只出现一次的数字
一、题目一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。二、思路利用异或运算。异或运算的规则:参与异或的两个数,两个相应位相同则为 0,相异则为 1。异或运算的特点:两个相同的数异或结果为 0,一个数和 0 异或的结果还是它本身。把数组中的数都进行一次异或运算,结果就是两个只出现一次的数字异或的结果。由于这两个数字不同,异或的结果不为 0,并且结果中 1 所在的位表示两个数字的不同的位。所以,我们可以选定一个 1 所在的位(假设第二位是 1),将原数组原创 2020-06-22 21:27:46 · 223 阅读 · 0 评论 -
剑指 offer 刷题(30)——二叉搜索树与双向链表
一、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二、思路——递归先画一棵简单的二叉树搞清楚变化的过程。递归,将左子树构造成双向链表,返回该链表的头节点;如果左子树不为空,就将根节点加到左子树链表的后面;递归,将右子树构造成双向链表,返回该链表的头节点;如果右子树不为空,就将右子树链表接在根节点之后;整棵树构造完毕。如果树不为空,就返回构造的结果三、代码public class Solution { pu原创 2020-06-21 20:17:53 · 136 阅读 · 0 评论 -
剑指 offer 刷题(29)——把字符串转换成整数
一、题目将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回 0二、思路如果是一个只含有数字的字符串,转换成数字很简单。从左到右每次取一位字符 digit,利用 result = result * 10 + digit 最后...原创 2020-04-15 11:59:06 · 204 阅读 · 0 评论 -
剑指 offer 刷题——23. 链表中环的入口节点
一、题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。二、思路(来自牛客题解)设置快慢两个指针,快指针每次走两步,慢指针每次走一步,则有如下两个结论:如果链表有环,则两个指针一定会相遇,且相遇于环内某一点;让快指针和慢指针分别从头节点和相遇点出发,每次走一步,则两个指针会相遇在环入口。结论一显而易见,结论二证明如下:设:a: 头节点到环入口的距离;...原创 2020-04-15 09:25:11 · 131 阅读 · 0 评论 -
剑指 offer 刷题(27)——和为 S 的连续正数序列
一、题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序...原创 2020-04-14 12:41:12 · 171 阅读 · 0 评论 -
剑指 offer 刷题(26)——两个链表的第一个公共节点
一、题目输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)二、思路及代码实现首先要搞清楚公共节点的含义:如果存在公共节点的话,那么两个链表从该节点之后的元素都是相同的,即两个相交的链表呈 Y 型。那就有两种思路:一种是从前往后比较,一种是从后往前比较。方法一:从前往后也就是比较两个链表前面不同的节点,直至找到...原创 2020-04-14 10:55:16 · 299 阅读 · 0 评论 -
剑指 offer 刷题——28. 对称的二叉树
一、题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。二、思路先求出这棵二叉树对应的镜像树,然后逐个比较两棵树的节点。都可以递归实现。三、代码public class Solution { boolean isSymmetrical(TreeNode pRoot){ if(pRoot == null)...原创 2020-04-13 12:48:56 · 136 阅读 · 0 评论 -
剑指 offer 刷题——08. 二叉树的下一个节点
一、题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。二、思路中序遍历的顺序是:左子树------根节点------右子树。先分析二叉树中一个节点的中序遍历顺序的下一个节点的情况:(1)二叉树为空,返回空;(2)该节点有右孩子,则其右孩子的左叶子节点就是该节点中序遍历的下一个节点。(3)该节点没有...原创 2020-04-13 12:17:37 · 197 阅读 · 0 评论 -
剑指 offer 刷题(23)——按之字形顺序打印二叉树
一、题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。二、思路先把二叉树按层遍历,然后重新输出按层遍历的结果:偶数行从左到右打印,奇数行从左到右打印,得到的结果即为按之字形打印的顺序。注意:偶数行从左到右打印,奇数行从左到右打印。可以借助 LinkedList 的迭代器实现,使用 list....原创 2020-04-12 14:20:30 · 179 阅读 · 0 评论 -
剑指 offer 刷题(22)——把二叉树打印成多行
一、题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。二、思路参考:二叉树的层次遍历在层序遍历的基础上,记录每一层的节点数,出队时每次出队一层的节点后再遍历下一层。三、代码public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ...原创 2020-04-12 13:05:22 · 113 阅读 · 0 评论 -
剑指 offer 刷题(21)——序列化二叉树
一、题目请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到...原创 2020-04-11 17:08:56 · 117 阅读 · 0 评论 -
剑指 offer 刷题——12. 矩阵中的路径
一、题目二、思路回溯法:创建一个和字符矩阵大小相同的布尔型矩阵,记录矩阵中的位置是否走过,走过为 true,没走过则为false;从 (0, 0) 开始,遍历字符矩阵,先找到字符串的第一个字符在字符矩阵中的位置;从该位置向左、右、上、下四个方向探索,匹配字符串的下一个字符;若全部匹配成功,返回 true;否则,回溯至上一步,继续探索,直至遍历完整个字符数组;探索过程中,要注意边界...原创 2020-04-11 14:33:53 · 181 阅读 · 0 评论 -
剑指 offer 刷题——13. 机器人的运动范围
一、题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?二、思路回溯法:创建一个 m * n ...原创 2020-04-11 13:24:48 · 211 阅读 · 0 评论 -
剑指 offer 刷题——14. 剪绳子
一、题目给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述:输入一个数n,意义见题面。(2 <= n <= 60)输出描述...原创 2020-04-11 09:12:43 · 141 阅读 · 0 评论 -
剑指 offer 刷题——50. 第一个只出现一次的字符
一、题目在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).二、思路统计字符串中字符出现的次数。由于字符串中的字母区分大小写,则需创建长度为 58 的数组,统计字符串中字母出现的次数,返回第一个只出现一次的字母的在字符串的索引即可。三、代码public class Solutio...原创 2020-04-09 12:58:46 · 158 阅读 · 0 评论 -
剑指 offer 刷题(16)——求1+2+3+...+n
一、题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A ? B : C)。二、思路及代码方法一:高斯求法1+2+3+...+n=n(1+n)2=n2+n21 + 2 + 3 + ... + n = \frac{n(1 + n)}{2} = \frac{n^2 + n}{2} 1+2+3+...+n=2n(1+n...原创 2020-04-09 11:23:11 · 228 阅读 · 0 评论 -
剑指 offer 刷题(15)——把数组排成最小的数
一、题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。二、思路(来自牛客题解)将数组中的元素放入 List 中,利用集合类的排序方法自定义比较器,对 List 中的元素进行排序,最后把 List 中的元素拼接成字符串输出。比较器中定义的比较规则是public ...原创 2020-04-08 19:54:19 · 156 阅读 · 0 评论 -
剑指 offer 刷题(14)——字符串的排列
一、题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。二、思路参考有重复数字的全排列:https://blog.youkuaiyun.com/weixin_45594025/article/d...原创 2020-04-08 18:31:04 · 186 阅读 · 0 评论 -
剑指 offer 刷题(12)——二叉树中和为某一值的路径
一、题目输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)二、思路题目中的路径定义为:从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。即采用深度优先搜索的策略,从根节点搜索至一个叶节点为止。因此,考虑用回溯法求解,搜索至一个叶节...原创 2020-04-07 15:12:39 · 155 阅读 · 0 评论 -
剑指 offer 刷题——33. 二叉搜索树的后序遍历序列
一、题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二、思路二叉搜索树的后序遍历顺序是:左子树------>右子树------>根节点,所以,二叉搜索树的后序遍历序列的最后一个元素就是根节点。对于二叉搜索树,根节点的左子树的所有节点都小于根节点,根节点的右子树的所有节点都大于根节点。设...原创 2020-04-07 12:47:59 · 156 阅读 · 0 评论 -
剑指 offer 刷题(10)——不用加减乘除做加法
一、题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。二、思路首先知道,两个数异或:相当于每一位相加,而不考虑进位;两个数相与并左移一位:相当于求得进位;将上述两步的结果相加就能求得两数之和。编写程序时,如果进位不为零(有进位就要加),就重复上述的两步,直至进位为零。举个例子,num1 = 9 = 1001,num2 = 7 = 0111,sum ...原创 2020-04-06 20:22:57 · 149 阅读 · 0 评论 -
剑指 offer 刷题(9)——最小的 k 的个数
一、题目输入 n 个整数,找出其中最小的K个数。例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4,。二、思路方法一:使用 Arrays 工具类先对数组进行排序,然后取前 k 个数。方法二:创建一个 list 存储最小的 k 个数。使用循环,每次找到数组中的最小值,将其添加至 list 后并从数组中删除,如此循环 k 次即可。三、代码i...原创 2020-04-06 15:33:40 · 141 阅读 · 0 评论 -
剑指 offer 刷题(8)——栈的压入、弹出序列
一、题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、思路(来自牛客题解)借用一个辅助的栈,遍历压栈序列,先将第一个元素放入栈中,这里...原创 2020-04-05 19:43:04 · 143 阅读 · 0 评论 -
剑指 offer 刷题——26. 树的子结构
一、题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)二、思路(递归)给定两棵树,如图所示,Tree2 是 Tree1 的子结构。我们的目标就是查找 Tree1 中是否含有 Tree2。首先,先找到 Tree2 的根节点在 Tree1 中的位置(图中为节点 4),如果整棵 Tree1 都找不到,说明 Tree2 不是 Tree1 的子树;...原创 2020-04-05 16:40:07 · 131 阅读 · 0 评论 -
剑指 offer 刷题(6)——矩形覆盖
一、题目我们可以用2 * 1 的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2 * 1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:二、思路和斐波那契数列原理相同。n = 1 时,有一种覆盖方法;n = 2 时,有两种覆盖方法;… …n 块矩形覆盖时,若第一次选择竖着摆放一块 1 * 2 的矩形,则 n 块矩形的摆放方法总...原创 2020-04-05 11:09:22 · 143 阅读 · 0 评论 -
剑指 offer 刷题——21. 调整数组顺序使奇数位于偶数前面
一、题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。二、思路冒泡排序的思想:冒泡排序是两两比较相邻的元素,如果反序就交换,因此每一趟排序可将最大(最小)值交换至数组末尾。这里两两比较相邻元素,前偶后奇就交换。三、代码public class Solution {...原创 2020-04-04 13:06:12 · 145 阅读 · 0 评论