![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
lmclh
这个作者很懒,什么都没留下…
展开
-
剑指offer-栈的压、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。...原创 2021-03-27 10:33:47 · 66 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。思路:主要考察边界条件的判断,从左到右,从上到下,从右到左,从下到上依次打印。class Solution { public int[] spiralOrder(int[][] matrix) { if (matrix == null || matrix.length == 0){ return new int[0]; } int l = 0, r = matri原创 2021-02-27 20:28:55 · 60 阅读 · 0 评论 -
剑指offer-对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。思路:从顶至底递归,逐次比较每对节点是否相同./** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Sol原创 2021-02-27 17:35:12 · 54 阅读 · 0 评论 -
剑指offer-二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路:递归或者栈。递归交换每个节点的左右节点,实现得到二叉树镜像。注意要先暂存树的左子节点,如果不暂存的话递归完右子节点后左子节点的值就改变了。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { v原创 2021-02-03 19:28:44 · 71 阅读 · 1 评论 -
剑指offer-树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路:前序遍厉A数,找到与B数根节点相同值的节点,然后递归比较该节点的左子节点和右子节点。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tre原创 2020-12-30 09:37:27 · 56 阅读 · 0 评论 -
剑指offer-合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。思路:递归。先比较两个链表的头节点,然后递归调用比较后续节点。要注意先决条件。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { publi原创 2020-12-29 10:29:15 · 52 阅读 · 0 评论 -
剑指offer-反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。思路:方法一:递归。链表不断向后递归,直到递归至尾节点,改变链表指针的方向。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public原创 2020-12-28 21:50:13 · 49 阅读 · 0 评论 -
剑指offer-链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。思路:双指针。第一个指针先走k步,然后两个指针一起走,当第一个指针为空,第二个指针对应的就是倒数第k个节点;或者第一个指针先走k-1步,然后一起走,当第一个指针走到尾节点,第二个指针就是倒数第k个节点。还可以用栈的方法,但是需要O(N)额外空间。/** * Defini原创 2020-12-27 10:31:45 · 82 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路:双指针,一个指针从头开始,找第一个偶数;一个指针从尾开始,找第一个奇数,找到后交换。class Solution { public int[] exchange(int[] nums) { int i = 0, j = nums.length - 1; while (i < j){ while (i < j原创 2020-12-26 12:34:04 · 35 阅读 · 0 评论 -
剑指offer-表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是思路:要综合考虑到各种情况class Solution { public boolean isNumber(String s) { if (s == null || s.length() == 0){ re原创 2020-12-26 10:50:37 · 53 阅读 · 0 评论 -
剑指offer-删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。思路:单指针,找到需要删除的节点的前一个节点即可。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public Li原创 2020-12-24 22:14:41 · 50 阅读 · 0 评论 -
剑指offer-数值的整数次方
实现库函数pow的功能,求x的n次方。思路:二分法,每次将n变为原来的一半,将x变为x平方。如果n为偶数,直接二分;如果n为奇数,先分离一个x出来,再对n二分。当n为负数,要将x变为1/x,将n变为-n,但是java中int32变量n∈[−2147483648,2147483647],所以当n=−2147483648时执行n=-n会产生大数越界现象,可以先将n存入long型变量b,后面用b操作。或者可以先提出一个1/x,返回1/x*myPow(1/x,-n-1),这样可以保证n=2147483648-原创 2020-12-22 21:57:14 · 50 阅读 · 0 评论 -
剑指offer-二进制中1的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。思路:把一个整数减1之后和该整数做与运算,可以把整数二进制表示中最右边的1变成0,直到该整数变成0,就可以统计出1的个数public class Solution { public int hammingWeight(int n) { int res = 0; while (n != 0)原创 2020-12-21 22:08:52 · 43 阅读 · 0 评论 -
剑指offer-机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?思路:与矩阵中的路径一题一致,用深度优先搜索(DFS)方法,走过的格子...原创 2020-12-19 21:43:45 · 132 阅读 · 1 评论 -
剑指offer-矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。思路:深度优先搜索DFS + 剪枝,从下上右左四个方向递归。访问过的元素先设为空,递归后还原。class Solution { public boolean exist(char[][] board原创 2020-12-18 22:06:22 · 80 阅读 · 2 评论 -
剑指offer-旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。思路:我们要找到旋转后的数组中最小的元素,排序数组的查找问题首先考虑的方法就是二分法。观察旋转后的数组,发现可以分为两部分,左数组[3,4,5],右数组[1,2]。右数组每个元素都小于左数组,定义m=(i+j)/2,判断nums[m]和nums[j]的大小关系,如果nums[m]小于num原创 2020-12-17 22:13:37 · 58 阅读 · 0 评论 -
剑指offer-青蛙跳台阶
思路:与斐波那契数列一致,用动态规划思想。n级台阶,一次只能跳一步或者两步,n=1时一种跳法,n=2两种跳法,当n>2时,分情况讨论,第一次跳一步,后续为f(n-1)种跳法;否则为f(n-2)种跳法。class Solution { public int numWays(int n) { int a = 1, b = 1, sum = a + b; for (int i = 0; i < n; i++){ sum = (a + b原创 2020-12-17 21:37:16 · 46 阅读 · 0 评论 -
剑指offer-斐波那契数列
思路:不能使用递归!会有大量重复计算!比如计算f(n),需要先计算f(n-2)和f(n-1),计算f(n-2)需要f(n-3)和f(n-4),计算f(n-1)需要f(n-2)和f(n-3),产生重复计算。应该考虑使用动态规划方法,初始化a=0,b=1,sum=a+b,可以用sum使a和b交替前进。class Solution { public int fib(int n) { int a = 0, b = 1, sum; for (int i = 0; i <原创 2020-12-17 21:19:13 · 43 阅读 · 0 评论 -
剑指offer-两个栈实现队列
思路:两个栈,一个用来给队列尾部插入节点,一个用来队列头部删除节点。即栈A实现入队,栈B实现出队。实现栈可以用Stack或者LinkedList,Stack是数组,LinkedList是链表。通常不推荐使用Stack,效率较低。频繁地插入删除操作推荐使用LinkedList。class CQueue { Stack<Integer> A,B; public CQueue() { A = new Stack<>(); B = new S原创 2020-12-15 21:09:38 · 60 阅读 · 0 评论 -
剑指offer-重构二叉树
思路:给定前序遍历和中序遍历,首先可以从前序遍厉的第一个元素找到二叉树的头节点,通过头节点的值去中序遍历中找到对应位置,该位置记为index,index左侧为左子树,右侧为右子树,同时也知道了左右子树的节点个数,通过递归实现重构二叉树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *原创 2020-12-15 19:21:30 · 85 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
思路:①栈。先进后出,将原链表所有节点压入栈中,再依次弹出,实现逆序打印。②递归。访问节点时,先递归输出后面的节点,再输出自身节点。//栈public class Test{ public int[] reversePrint (ListNode head){ Stack<ListNode> stack = new Stack<>(); while (head != null){ //所有节点入栈 stack.原创 2020-12-15 10:50:59 · 47 阅读 · 0 评论 -
剑指offer-替换空格
重刷剑指offer day011.替换空格实现一个函数,把字符串每个空格替换成“%20”思路:在JAVA中,字符串不可以被修改,需要新建一个字符串实现。而C++中,字符串可以修改,可以在原字符串原地修改。public class Test{ public String replaceSpace(String s){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++){ if原创 2020-12-14 21:45:04 · 92 阅读 · 0 评论