![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指offer--JAVA实现
剑指offer--JAVA实现
韩师学子--小倪
不要告诉别人你的计划,只需要让别人知道结果就行了。
展开
-
67. 机器人的运动范围
题目描述:地上有一个 m 行和 n 列的方格。一个机器人从坐标 0,0 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。请问该机器人能够达到多少个格子?...原创 2020-12-19 11:29:16 · 89 阅读 · 0 评论 -
66. 矩阵中的路径
题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。...原创 2020-12-19 11:29:02 · 151 阅读 · 0 评论 -
65. 滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值原创 2020-12-19 11:28:51 · 71 阅读 · 0 评论 -
64. 数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。...原创 2020-12-19 11:28:37 · 80 阅读 · 0 评论 -
63. 求二叉搜索树的第 K 小的节点
题目描述:给定一棵二叉搜索树,请找出其中的第 k 小的结点原创 2020-12-19 11:28:22 · 232 阅读 · 0 评论 -
62. 序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树.原创 2020-12-19 10:11:06 · 128 阅读 · 0 评论 -
61. 把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。原创 2020-12-18 21:06:13 · 132 阅读 · 0 评论 -
60. 按之字形顺序打印二叉树
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,依此类推。原创 2020-12-17 21:15:50 · 134 阅读 · 0 评论 -
59. 对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意:如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。原创 2020-12-17 21:15:00 · 131 阅读 · 0 评论 -
58. 二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。原创 2020-12-17 21:14:18 · 85 阅读 · 1 评论 -
57. 删除链表中重复的节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针原创 2020-12-17 21:13:25 · 115 阅读 · 0 评论 -
56. 链表中环的入口节点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。原创 2020-12-17 21:12:32 · 135 阅读 · 0 评论 -
55. 字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。原创 2020-12-17 09:43:01 · 108 阅读 · 0 评论 -
54. 表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)原创 2020-12-17 09:25:05 · 85 阅读 · 0 评论 -
53. 正则表达式匹配
题目描述:请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符, 而* 表示它前面的字符可以出现任意次(包含0 次)原创 2020-12-17 09:20:37 · 150 阅读 · 0 评论 -
52. 构建乘积数组
题目描述:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B 中的元素B[i]=A[0]A[1]…A[i-1]A[i+1]…A[n-1]。其中A[i] = 1。不能使用除法,原创 2020-12-17 09:17:40 · 164 阅读 · 0 评论 -
51. 找出重复的数
题目描述:在一个长度为n 的数组里的所有数字都在0 到n-1 的范围内,找出数组中任意一个重复的数字原创 2020-12-17 09:14:53 · 133 阅读 · 0 评论 -
50. 树中两个节点的最低公共祖先
题目描述:给定一个二叉搜索树,输入两个节点,求树中两个节点的最低公共祖先思路:从根节点开始遍历树,如果节点p 和q 都在右子树上,那么以右孩子为根节点递归,如果节点p 和节点q 都在左子树上,那么以左孩子为根节点递归,否则就意味找到节p 和节点q 的最低公共祖先了。代码实现:public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null || p == null ||原创 2020-12-16 19:14:04 · 177 阅读 · 0 评论 -
49. 将字符串转换为整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0 或者字符串不是一个合法的数值则返回0思路:若为负数,则输出负数,字符0 对应48,9 对应57,不在范围内则返回0。代码实现:public int StrToInt(String str) { if (str == null || str.length() == 0) { return 0; } int mark = 0; int number = 0; char[] chars = str.toCh原创 2020-12-16 13:41:34 · 199 阅读 · 0 评论 -
47. 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:利用位运算代码实现:原创 2020-12-16 13:31:14 · 83 阅读 · 0 评论 -
46. 求1 到n 的和
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A?B:C)。思路:巧用递归(返回值类型为Boolean)代码实现:public int Sum_Solution(int n) { int sum = n; boolean result = (n > 0) && ((sum += Sum_Solution(n-1)) > 0); return sum;}...原创 2020-12-16 13:17:17 · 285 阅读 · 0 评论 -
45. 圆圈中最后剩下的数
题目描述:圆圈中最后剩下的数字(约瑟夫环)思路:利用公式法:f[n] = (f[n-1] + k) mod n,或使用循环链表实现代码实现:原创 2020-12-16 13:15:34 · 72 阅读 · 0 评论 -
44. 扑克牌的顺子
题目描述:从扑克牌中随机抽5 张牌,判断是不是一个顺子,即这5 张牌是不是连续的。2~10 为数字本身,A 为1,J 为11,Q 为12,K 为13,大小王可以看成任意数字。原创 2020-12-16 13:14:27 · 229 阅读 · 0 评论 -
43. n 个骰子的点数及出现的概率
题目描述:把n 个骰子扔在地上,所有骰子朝上一面的点数之和为s,输入n,打印出s 的所有可能出现的概率原创 2020-12-16 13:13:13 · 1429 阅读 · 0 评论 -
42.字符串中字符的移动
42.1 反转字符串题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。思路:切割成单词,然后从后面开始遍历即可。代码实现:public String reverseSentence(String sentence) { String[] array = sentence.split(" "); StringBuilder sb = new StringBuilder(); for(int i =array.length - 1; i >= 0;原创 2020-12-16 09:15:27 · 516 阅读 · 0 评论 -
41. 整数序列的查找
41.1 和为 S 的连续整数序列题目描述:输出所有和为 S 的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序思路:定义两个指针,分别递增,寻找和为 s 的序列。代码实现:public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> arrayList = new ArrayLis原创 2020-12-15 23:56:00 · 308 阅读 · 0 评论 -
40. 找出只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:两个相同的数异或后为 0,一个数和 0 异或还是它本身,将所有数异或后即得到 A、B 异或的结果。这两个数不相同,异或后,肯定不等于0。所以存在一个数的某个位置为1,另一个数在这个位置为0,所以可以据此分成两个数组。然后求得 1 在该数最右边出现的 index,确定好这个位置,然后判断每个数右移 index 后是不是 1来进行归类到哪个数组,最后,每个数组的结果分别对应一个数。代码实现:原创 2020-12-15 23:11:05 · 174 阅读 · 0 评论 -
39. 二叉树的深度
39.1 求某个二叉树的深度题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:利用递归遍历分别返回左右子树深度代码实现:时间复杂度:O(n),空间复杂度:O(log n)public int maxDepth(TreeNode root) { if (root == null) { return 0; } int left = maxDepth(root.left); int right = ma原创 2020-12-15 13:51:24 · 106 阅读 · 0 评论 -
38. 求某个数在数组中出现次数
题目描述:统计一个数字在排序数组中出现的次数。思路:利用二分查找+递归思想,进行寻找。当目标值与中间值相等时进行判断代码实现:public static int getNumberOfK(int[] arraySorted, int k) { if (arraySorted == null || arraySorted.length == 0) { return 0; }if (arraySorted.length == 1) { return arraySorted[0] == k原创 2020-12-15 13:29:48 · 642 阅读 · 0 评论 -
37. 两个链表的第一个公共节点
题目描述:输入两个链表,找出它们的第一个公共结点。思路:先求出链表长度,然后长的链表先走多出的几步,然后两个链表同时向下走去寻找相同的节点,代码量少的方法需要将两个链表遍历两次,然后从头开始相同的节点。代码实现:public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p1 = pHead1; ListNode p2 = pHead2; while (p1 != p2){ p1 = (原创 2020-12-15 13:18:18 · 121 阅读 · 0 评论 -
36. 数组中逆序对的个数
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P.原创 2020-12-15 13:17:20 · 344 阅读 · 0 评论 -
35. 第一个出现一次的字符
题目描述:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置思路:利用LinkedHashMap 保存字符和出现次数。代码实现:public int FirstNotRepeatingChar(String str) { if (str == null || str.length() == 0) return -1; char[] c = str.toCharArray(); LinkedHashMap<Chara原创 2020-12-15 09:01:07 · 65 阅读 · 0 评论 -
34.求第N 个丑数
题目描述:求从小到大的第N 个丑数。丑数是只包含因子2、3 和5 的数,习惯上我们把1 当做是第一个丑数。思路:乘2 或3 或5,之后比较取最小值。代码实现:原创 2020-12-14 23:32:58 · 151 阅读 · 0 评论 -
33. 把数组中的数排成一个最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个思路:先将整型数组转换成String 数组,然后将String 数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。根据题目的要求,两个数字m和n能拼成数字mn和nm,如果mn>nm,我们就应该让n在前m在后,也就是定义n小于m,反之同理。如果mn=nm,就要定义n等于m。一个有效的比较规则需要满足三个条件:自反性、对称性和传递性,那么我们就来证明一下: 自反性:显然有 aa=aa原创 2020-12-14 20:44:43 · 163 阅读 · 0 评论 -
32. 从1 到非负整数n 中1 出现的次数
题目描述:输入一个整数n,求从1 到整数n 的十进制表示中1 出现的次数数学归纳法:在这里我们任意取一个数来举例说明:比如n=389百位:该位置上的数字是3(>1),说明之前的百位数为1的数都能取到,所以1的个数是100-199一共有100个;(这里的3是最高位,那么就只有一种可能,可以看做是(0+1)种可能)。十位:该位置上的数字是8(>1),说明十位上为1的数都可以取到的,而这里需要注意的是,前面 百位上的数字是3,那么百位上的取值可能就是[0,1,2,3],即(3+1)种可能,而每一原创 2020-12-14 20:07:45 · 187 阅读 · 0 评论 -
31. 连续子数组的最大和
题目描述:输入一个整型数组,数组中有正数也有负数,数组中一个或连续的多个整数组成一个子数组,求连续子数组的最大和思路:若和小于0,则将最大和置为当前值,否则计算最大和。代码实现:时间复杂度:O(n),空间复杂度:O(1)public int maxSubArray(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int sum = 0; int result = nums[0]; for (int n原创 2020-12-14 19:17:15 · 129 阅读 · 1 评论 -
30. 找出最小的K 个数
题目描述:输入n 个整数,找出其中最小的K 个数。方法 一:要求数组中最小的k个数,最容易想到的就是利用冒泡排序的思想,每一轮排序把剩余数组中最小的一个数字放到前面已排序的后面,只要进行K轮即可。代码实现: public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { if(input == null) return null; Array原创 2020-12-14 13:46:16 · 215 阅读 · 0 评论 -
29. 数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。如果不存在则输出0。思路:将首次出现的数count+1,与之后的数进行比较,相等则+1,否则—1,最后进行校验是否超过长度的一半。代码实现:public static int moreThanHalfNum(int[] nums) { int count = 0; int candidate = 0; for (int num : nums) { if (count == 0) { candidate = nu原创 2020-12-14 13:22:29 · 129 阅读 · 0 评论 -
28. 打印字符串中所有字符的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c 所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:将当前位置的字符和前一个字符位置交换,递归。代码实现: public Set<String> Permutation(String str) { Set<String> res = new HashSet<>(); if (str == n原创 2020-12-14 09:29:48 · 227 阅读 · 0 评论 -
27. 二叉搜索树转换为双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:首先需要明白二叉搜索树也是一种排序的数据结构,它的中序遍历就是一个不递减的顺序排列所以如果要转换成一个排序好的双向链表,那么仅需要改变原来指向左子节点和右子节点的指针,让他们分别指向前节点和后节点即可,如图所示 调整指针原先指向左子节点的指针调整为链表中指向前一个节点的指针原先指向右子节点的指针调整为链表中指向后一个节点的指针...原创 2020-12-14 09:01:51 · 895 阅读 · 0 评论