
剑指offer
题解
睡醒就学
备忘录
展开
-
28.对称的二叉树
题干: 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。题解: 判断root1的左节点和root2的右节点、root1的右节点和root2的左节点是不是相等/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x)原创 2022-04-22 16:45:11 · 425 阅读 · 0 评论 -
27.二叉树的镜像
**题干:**请完成一个函数,输入一个二叉树,该函数输出它的镜像。题解: 递归交换左右节点,先暂存左节点,因为递归之后左节点就变了/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solutio原创 2022-04-22 16:15:37 · 1496 阅读 · 0 评论 -
25.合并两个排序的链表
题干: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。题解: 先设置一个新链表的头节点,然后依次判断l1和l2链表中值的大小,如果有一个链表为空就跳出循环,然后把没空的那一个链表加到新链表的后面/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; }原创 2022-04-22 15:54:30 · 320 阅读 · 0 评论 -
24.反转链表(要多看看)
题干: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。题解: 定义一个pre指针/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode reverseList原创 2022-04-21 16:45:14 · 246 阅读 · 0 评论 -
22.链表中倒数第k个节点
题干: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。题解: 先计算链表中一共有多少个节点,然后计算倒数第k个节点是从头到尾数的第几个节点,然后将该节点变成head节点/** * Definition for singly-linked list. * public class ListNode {原创 2022-04-21 15:23:38 · 238 阅读 · 0 评论 -
21.调整数组顺序使奇数位于偶数前面
题干: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。题解: 用了比较笨的方法,用数组分别存奇数和偶数,然后整合到一个数组里class Solution { public int[] exchange(int[] nums) { int len = nums.length; int[] num1 = new int[len]; int[] num2 = new int[len];原创 2022-04-20 21:38:16 · 266 阅读 · 0 评论 -
18.删除链表的节点
题干: 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题解: 首先判断一下头结点是不是要删除的节点,如果是就将链表的头结点设置为下一个节点。然后判断p.next是不是要删除的节点。这里不能直接判断p节点是因为这不是双向链表,如果要删除p节点,就要将p节点的前一个节点的next指针指向p.next,这里不能得到p的前一个指针,所以不能直接判断p。/** * Definition for singly-linked list. * public class原创 2022-04-20 16:59:10 · 512 阅读 · 0 评论 -
17.打印从1到最大的n位数
题干: 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。题解: 给定位数n,那么最大的n位数就是10^n-1,用 Math.pow(a,b)求a的b次方class Solution { public int[] printNumbers(int n) { int len = (int)Math.pow(10,n); int[] result = new int[len-1];//注意数原创 2022-04-18 19:01:48 · 196 阅读 · 0 评论 -
15.二进制中1的个数
题干: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。题解: 如果像十进制那样循环(cnt = n%2, n/=2),当n为负数的时候就会报错。这里可以用到与运算,n&1=1就说明最后一位是1,如果n&1=0就说明最后一位是0,判断完最后一位然后进行右移,需要注意的是有符号的右移是>>,无符号的右移是>>>public class Solution { // you原创 2022-04-18 17:48:56 · 133 阅读 · 0 评论 -
11.旋转数组的最小数字
题干: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。题解: 没看懂题目,用原创 2022-04-18 16:56:48 · 123 阅读 · 0 评论 -
10.2.青蛙跳台问题
题干: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。题解: 这个和斐波那契数列那道题一样,都是用动态规划做。假设要跳i个台阶,最后一次如果跳2级台阶,那么就和前面跳i-2级台阶是一样的;最后一次如果跳1级台阶,那么就和前i-1级台阶的情况是一样的。最后把这两种情况相加就是总共的跳法。这里要注意的是dp[0]=1class Solution {原创 2022-04-18 16:30:23 · 723 阅读 · 0 评论 -
10.1.斐波那契数列
题干:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。题解: 直接递归会超时,这里用动态规划做class Solution {原创 2022-04-18 14:40:23 · 617 阅读 · 0 评论 -
09.用两个栈实现队列
题干:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )题解:先定义两个栈作为成员变量,第一个栈sin用来入队,第二个栈sout用来出队。加入成员就直接push进sin,删除的话就要先把sin栈中的元素存到sout栈中,sin就相当于把sout翻转了,然后peek查找栈顶元素,记录下来并删除。接下来再把sout中的元素放回到sin里,就原创 2022-04-17 20:56:14 · 88 阅读 · 0 评论 -
06.从尾到头打印链表
题干:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。题解:定义一个ArrayList数组存链表中的结点值class Solution { public int[] reversePrint(ListNode head) { ArrayList<Integer> arr = new ArrayList<Integer>(); for(ListNode p=head; p!=null; p=p.next){原创 2022-04-17 19:44:30 · 313 阅读 · 0 评论 -
05.替换空格
先利用一个char数组去存每个字符,最后将char数组变成String返回,这里要注意的是Strings=newString(c,0,size)的用法。请实现一个函数,把字符串s中的每个空格替换成"%20"。原创 2022-03-03 10:33:37 · 83 阅读 · 0 评论 -
03.数组中重复的数字
数组中重复的数字题干: 找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。解题思路: 重新定义一个数组cnt,用来记录nums数组中各数字出现的次数。举个例子,nums[0]=2此时cnt[nums[0]]=cnt[2]=1,也就是说数字2出现了1次,如果遍历的时候再遇到数字2出现,而cnt[2]不等于0,则说明2之前已经出现过了,直接返回即可。因原创 2020-05-17 13:52:35 · 274 阅读 · 0 评论