- 博客(46)
- 收藏
- 关注
原创 栈的压入、弹出序列 java
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), pu
2021-01-12 20:07:10
247
原创 包含min函数的栈 java 实现
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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(); --> 返回 0
2021-01-12 17:30:37
190
原创 顺时针打印矩阵 java 详细
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 100leetcode:顺时针打印矩阵解题思路顺时针从外到里打印,每一圈都从该圈的左上角开始。可知每一圈打印都有相似的处理步骤,不同点是新的一圈开始时的坐标不同
2021-01-08 20:56:45
1045
原创 对称的二叉树 java 递归
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3示例 1:输入
2021-01-08 18:34:21
132
原创 二叉树的镜像递归 java
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9镜像输出: 4 / \ 7 2 / \ / \ 9 6 3 1LeetCode:二叉树的镜像解题思路对于一棵二叉树而言,每个节点都可以看成一棵以该节点为根节点的二叉树,即具有相同的子结构,可以
2021-01-05 13:48:39
128
原创 树的子结构 java
题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。LeetCode:树的子结构解题思路第一步:在树A中找到和树B的根节点的值一样的节点R(A.val == B.val);进行第二步第二步:判断树A中以R
2021-01-04 17:44:53
94
原创 合并两个排序的链表 java
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路由于链表是递增的,所以我们可以先比较两个链表的第一个节点,选择节点值比较小的作为头节点,然后再用同样的思路合并剩余节点,由此可知,可以采用递归进行解答。代码/*** class ListNode {* int val;* ListNode n
2021-01-04 16:29:35
156
原创 反转链表 java
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL0 <= 节点个数 <= 5000解题思路设置两个指针,一个指向当前 cur ,一个指向当前的上一个 pre ,当 cur 所指不为 null 时,两个指针在链表上都往后走一步,对应操作为:pre = cur;cur = cur.next;接着
2021-01-04 15:40:51
149
原创 链表中环的入口节点(详细分析) java
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。牛客网:链表中环的入口节点解题思路(1)首先需要确定链表中是否包含环,可以用两个快慢指针 fast 和 slow 表示:两个指针同时从链表的头结点出发,fast 一次走两步,slow 一次走一步。如果走得快的指针追上; 走的慢的指针,那么链表就含环(当一个链表含环时,指针已进入该环的节点就一直绕圈圈);如果走的快的指针走到了链表的末尾(fast.next 指向 null)都没有追上走的慢的指针,那么链表就不含环。(2
2021-01-04 12:38:51
248
原创 链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。LeetCode:链表中倒数第k个节点示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路题目要求找出链表中倒数第 k 个节点,也即第 n - k + 1 个节点因为是单项链
2021-01-04 10:38:10
116
原创 调整数组顺序使奇数位于偶数前面 java
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。leetcode:调整数组顺序使奇数位于偶数前面注意:leetcode上所给提示虽然是 1 <= nums.length <= 50000 但是测试用例含有 [] (不讲武德!大意了,没有闪)解题思路使用左右两个指针 pleft .
2021-01-03 21:32:18
190
原创 java 交换交换数组中的两个元素的几种方法
swap函数用来交换数组中的两个值public void swap(int[] data,int num1, int num2) { data[num1] = data[num1] ^ data[num2]; data[num2] = data[num1] ^ data[num2]; data[num1] = data[num1] ^ data[num2]; 交换两个数字还有以下实现方法,异或运算直接对二进制进行运算,比较快//
2021-01-03 21:30:15
5257
原创 表示数值的字符串 java 实现
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。LeetCode:表示数值的字符串‘.’出现正确情况:只出现一次,且在e的前面‘e’出现正确情况:只出现一次,且出现前有数字‘+’‘-’出现正确情况:只能在开头和e后一位代码中 return numFlag 作用为:因为输入的字
2021-01-03 18:49:45
218
原创 正则表达式匹配 java 递归实现
题目描述给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例:输入:s = "aa" p = "a"输出:false解释:"a" 无法匹配 "aa" 整个字符串。提示:0 <= s.length <= 200 <= p.length <= 30s 可能为空,且只包含从 a-z 的小写字母
2021-01-03 15:09:03
351
原创 java toCharArray() 方法会改变定义数组时的长度
目的:想要使用 String 类的 toCharArray() 方法,且数组长度大于字符串的长度 String s = "123456789"; System.out.println("s.length() : " + s.length()); char[] str = new char[s.length() + 1]; int expectedLength = str.length; System.out.println("expectedLength : " + expectedLengt
2021-01-03 12:33:16
864
1
原创 在 idea 和 eclipse 中查看 java 源码
在 java 的日常学习中,有时候需要查看 java 中某一个类以及某个方法的介绍,使我们更好的了解java,那么如何查看 java 源码呢? 最简单的方法就是在 IDEA 或 Eclipse 中将鼠标放置在希望转跳到源码的函数或者类上,然后点击左键即可定位到源码位置。...
2021-01-03 11:42:05
236
原创 删除链表中重复的节点 java 递归实现
题目描述:在一个排序的链表中,删除重复的节点思路及代码public ListNode deleteDuplication(ListNode head) { // 边界条件 if (head == null || head.next == null) return head; ListNode next = head.next; // 当 head.val 与后续值相等时,继续向后查找,直到找到一个与 head.val 不相等的节点
2021-01-02 17:36:51
259
原创 在 O(1) 时间内删除链表节点 java
题目描述:给定单项链表的头指针和一个节点指针,定义一个函数在 O(1) 时间内删除该节点。解题思路因为所给链表为单向链表,题中要求时间复杂度为 O(1) ,注意到题中给出了要删除节点的指针,可以在这方面下文章:我们可以直接将所要删除节点的下一个节点的值赋给删除节点,并将该节点指向下下个节点,再删除下一个节点,从而达到删除给定节点的目的。如果要删除的节点位于链表的尾部,它没有下一个节点,此时需要从链表的头结点开始,顺序遍历到该节点的前一节点,完成删除操作代码/**class ListNode {
2021-01-02 16:32:57
175
原创 剑指 Offer 17. 打印从1到最大的n位数(考虑大数问题) java
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。注:leetcode上该题标记为简单,并未考虑大数情况解题思路n 位数的每一位上都是从 0 到 9 的全排列,我们可以使用递归方法将数字的每一位都从 0 到9 排列一遍,从而得到所有十进制数。递归结束的条件是我们已经设置了数字的最后一位。由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 char 数组进行存储。char 数组索引为 0 对应的数字即为
2021-01-02 14:49:18
147
原创 剑指 Offer 16. 数值的整数次方 java 分治思想
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。LeetCode:剑指 Offer 16. 数值的整数次方解题思路最直观的解法是将 x 重复乘 n 次,即 x*x*x…*x,时间复杂度为 O(N)。因为乘法是可交换的,所以当 n 为偶数时,可以将上述操作拆开成两半 (x*x…*x) * (x*x…*x),两半的计算是一样的,因此只需要计算一次(当 n 为奇数时只需要再乘一个 x
2021-01-02 11:49:04
120
原创 剑指 Offer 15. 二进制中1的个数java 位运算
题目描述请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。注:题目中说的(以二进制串形式)应该是测试代码,我们在解题时只需按照输入一个整数这一要求解题即可LeetCode:剑指 Offer 15. 二进制中1的个数解题思路可以使用位运算:n&(n-1) 位运算可以将 n 的二进制表示中最低的那一位 1 设置为 0。不断将 1 设置为 0,直到 n 为 0。代码
2021-01-02 11:02:12
69
原创 java实现最小覆盖子串最后一个测试不通过
题目描述leetcode:76. 最小覆盖子串给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"示例 2:输入:s = "a", t = "a"输出:"a"提示:1 <= s.length, t.length <= 105
2020-12-26 09:40:08
299
原创 java 中 subtring 的用法
java中的substring 与 c++中的substr的用法不同java中substring有两种用法:假设:String s = “0123456789”;String sub1 = s.substr(7); // 只有一个数字7表示从下标为7开始一直到结尾:sub1 = “789”String sub2 = s.substr(7, 9); // 从下标为7开始到下标为9结束(下标9不截取)截取长度为9 - 7 = 2 位:sub2 = “78”c++中substr有2种用法:假设:str
2020-12-24 11:28:42
1957
原创 剑指 Offer 14. 剪绳子java 动态规划与贪心算法
题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0] * k[1] *...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 +
2020-12-20 16:54:53
118
原创 剑指 Offer 13. 机器人的运动范围
题目描述地上有一个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。请问该机器人能够到达多少个格子?leetcode : 剑指 Offer 13. 机器人的运动范围示例 1:输入:m =
2020-12-20 15:14:06
188
原创 剑指 Offer 12. 矩阵中的路径 java dfs
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一
2020-12-19 19:35:17
98
1
原创 剑指 Offer 11. 旋转数组的最小数字 java
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。leetcode : 剑指 Offer 11. 旋转数组的最小数字...
2020-12-19 15:59:19
80
2
原创 二分查找边界条件确认java
二分查找的边界确认问题:寻找一个数,寻找左侧边界,寻找右侧边界二分查找的效率很高,为 log2n,(是以2为底,n的对数)但是有关二分查找的几个细节问题很难确认:如 mid 加一还是减一;while 判断条件到底是<=还是<结论:搜索一个元素时,搜索区间两端闭,while 条件带等号,if相等就返回,mid 必须加减一,因为区间两端闭,while 循环结束就是没找到,返回-1搜索左右边界时,搜索区间要阐明,左闭右开最常见,其余逻辑便自明,while 要用小于号,这样才能不漏掉,if相等别.
2020-12-19 08:58:18
722
2
原创 Partition函数实现java(含分析)
Partition函数作用在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到到数组的右边。Partition还可以用来实现长度为n的数组中查找第k大的数字;以及“数组中超过数字一半的数字”和“最小的k个数”Partition代码int Partition(int data[], int length, int start, int end) { if (data == null || length <= 0 || s
2020-12-16 16:51:22
1269
1
原创 快速排序 java (含Partition()函数实现)详细
快排实现// 递归实现,相关调用函数代码实现在下面void QuickSort(int[] data, int length, int start, int end) { if (start == end) return; int index = Partition(data, length, start, end); if (index > start) QuickSort(data, length, start, inde
2020-12-16 16:50:21
968
2
原创 剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1提示: 0 <= n <= 100斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:
2020-12-16 13:53:02
92
原创 剑指offer 9 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )leetcode:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"]
2020-12-16 11:45:52
74
原创 剑指offer8 二叉树的下一个节点 java实现
解题思路有如下情况: 1.如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; (中序遍历的过程:先遍历树的左子树,再遍历根节点,最后再遍历右子树。所以最左节点是中序遍历的第一个节点。) 2.如果一个节点的右子树不为空,向上找第一个左链接指向的树包含该节点的(祖先节点)。 (如果一个节点没有右子树,且节点是她父节点的左子树,那么他的下一个节点就是他的父节点) (如果一个节点既没有右子树,且他还是他父节点的右子节点,可以沿着指向父节点的指针一直 向上遍历,直到
2020-12-16 10:33:13
83
原创 BFS算法(广度优先搜索)java
BFS介绍BFS:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS 的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。BFS 出现的常见场景,问题的本质就是让你在一幅「图」中找到从起点start到终点target的最近距离。嘛意思呢,假设你
2020-12-15 21:35:56
3770
2
原创 剑指offer 重建二叉树 java实现
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制:0 <= 节点个数 <= 5000leetcode:https://leetcode-cn.com/problems/zhong
2020-12-14 16:03:19
130
2
原创 剑指 Offer 从尾到头打印链表java实现
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000leetcode:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/解题思路从尾到头打印链表,即LIFO,使用栈,最后数组输出,第一次考虑选择ArrayList转为Array时出错,不能转换成功,网上有通过java
2020-12-14 10:10:49
162
原创 剑指offer 替换空格java实现
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000leetcode:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/解题思路将String转为BufferString,一个空格要替换成三个字符(%20),所以当遍历到一个空格时,需要在尾部填充两个任意字符。令 p1 指向
2020-12-13 16:39:25
110
1
原创 剑指offer 二维数组中的查找java实现
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 true
2020-12-13 11:20:41
117
原创 剑指offer 数组中重复的数字java实现
解题思路说明:该题在leetcode1.此解决方案是按照剑指offer中的思路写的:数组中的数字都在0~n-1的范围内,如果这个数组中没有重复的数字,那么当数组排序后数字i将出现在下标为i的位置。由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字。首先 重排数组:从头到尾依次扫描,当扫描到下标为i的数字时,判断这个数字(用m表示)是否等于i,如果不等,将m与下标为m的元素比较,若相等,则m为重复值,返回m,如果不等,将下标i与下标m对应的元素交换(即交换下标i对应的元素值m与下
2020-12-13 10:02:54
115
原创 [DP,贪心]剪绳子问题中的几个疑惑(已解决)
关于《剑指offer》中剪绳子的几个问题:-题意中m>1表示所给的绳子最少剪一刀。-文中使用products数组用于存储长度为n的绳子剪成m段后的最大乘积,但是前四个元素并非题中所分析的数值{f(2)=1;f(3)=2}? -真正的理解应该为:products数组中下标>=4时对应的元素是长度为n的绳子剪成m段后的最大乘积。动态规划方法中products[0] = 0;products[1] = 1;products[2] = 2;products[3] = 3;代表当n
2020-12-08 13:16:05
132
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人