- 博客(244)
- 收藏
- 关注
原创 (中等)LeetCode 328. 奇偶链表 Java
对于每个链表,每个节点是奇数节点或者偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶数节点分离成奇数链表和偶数链表,然后将偶数链表连接在奇数链表之后,合并后的链表即为结果链表。原始链表的头节点head也是奇数链表的头节点以及结果链表的头节点,head的后一个节点是偶数链表的头节点。最后令odd.next=evenHead,将偶数链表连接在奇数链表之后,即完成了奇数链表和偶数链表的合并,结果链表的头节点仍然是head。如果链表为空,则直接返回链表。
2023-07-17 20:05:14
400
原创 (中等)LeetCode146 LRU 缓存 Java
上述各项操作中,访问哈希表的时间复杂度为O(1),在双向链表的头部添加节点,在双向链表的尾部删除节点的复杂度也为O(1)。而将一个节点移动到双向链表的头部,可以分成【删除该节点】和【在双向链表的头部添加节点】两步操作,都可以在O(1)的时间内完成。本题有两种实现操作,需要使用到一个哈希表和一个双向链表。在Java语言中,有一种结合了哈希表和双向链表的数据结构,LinkedHashMap。LRU缓存机制可以通过哈希表辅以双向链表实现,需要使用。维护所有在缓存中的键值对。
2023-07-17 19:14:25
460
原创 (中等)LeetCode 3. 无重复字符到的最长子串 Java
当我们一次递增地枚举子串的起始位置,会发现子串的结束位置也是递增的,原因在于,假设选择字符串中的第k个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为。在左指针向右移动的时候,从哈希集合中移除一个字符,在右指针向右移动时,向哈希集合中添加一个字符。的字符显然是不重复的,并且由于少了原来的第k个字符,可以尝试继续增大。,那么,从第k+1个字符作为起始位置时,首先从k+1到。,那么,其中最长的那个字符串即为答案。,直到右侧出现重复字符为止。
2023-07-16 13:17:59
513
原创 (中等)剑指Offer II 062.实现前缀树 Java
若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应的节点的isEnd为真,则说明字典树中存在该字符串。重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾。从字典树的根开始,插入字符串。从字典树的根开始,查找前缀。重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。
2023-07-16 10:12:49
380
原创 (简单)设计哈希集合 Java
开辟一个大小为base的数组,数组的每个位置是一个链表。当计算出哈希值之后,就插入到对应位置的链表中。依据提示创建了长度为10^6+1的数组set,如果向set中添加了某个数字x,则将set[x]置为1。设计哈希表大小为base,则可以设计一个简单的哈希函数:hash(x) = x mod base。由于该方法使用整数除法作为哈希函数,为了尽可能避免冲突,应当将base取为一个质数。方法,也可以利用链表来构建set。
2023-07-16 09:29:58
150
原创 (简单)剑指Offer 21. 调整数组顺序使奇数位于偶数前面 Java
记数组nums的长度为n。从先nums左侧开始遍历,如果遇到的是奇数,就表示这个元素已经调整完成,继续从左往右遍历,直到遇到一个偶数。然后从nums右侧开始遍历,如果遇到的是偶数,就表示这个元素已经调整完成了,继续从右往左遍历,直到遇到一个奇数,将换这个偶数和奇数的位置,并且重复两边的遍历,直到在中间相遇,nums调整完成。
2023-07-14 15:31:39
287
原创 (简单)剑指Offer II 056. 二叉搜索树中两个节点的和 Java
计算下一个位置时,首先将位于栈顶的当前节点从栈中弹出,此时,首先判断当前节点是否存在右子节点,如果存在,那么将右子节点的最左子树加入到栈中;在方法三中,是在中序遍历得到的数组上进行双指针,这样需要消耗O(n)的空间,实际上可以将双指针的移动理解为在树上的遍历过程的一次移动。具体地,使用两个指针分别指向数组的头尾,当两个指针指向的元素之和小于k时,让左指针右移;当两个指针指向的元素之和大于k时,让右指针左移;二叉搜索树的中序遍历是升序排列的,可以将该二叉搜索树的中序遍历的结果记录下来,得到一个升序数组。
2023-07-14 15:14:37
180
原创 【哈希表/字符串-简单】LeetCode 205 同构字符串 Java
从左至右遍历两个字符串的字符,不断更新两张哈希表,如果出现冲突(即当前下标index对应的字符s[index]已经存在映射且不为t[index]或当前下标index对应的字符t[index]已经存在映射且不为s[index])时,说明两个字符串无法构成同构,返回false。需要判断s和t每个位置上的字符是否都一一对应,即s的任意一个字符被t中唯一的字符对应,同时t的任意一个字符被s中唯一的字符对应。这也被称为【双射】的关系。如果遍历结束没有出现冲突,则表明两个字符串是同构的。
2023-07-13 11:37:51
227
原创 【字符串 简单】LeetCode 14. 最长公共前缀 Java
用minLength表示字符串数组中的最短字符串的长度,则可以在[0,minLength]的范围内通过二分查找得到最长公共前缀的长度,每次取查找范围的中间值mid,判断每个字符串的长度为mid的前缀是否相同,如果相同则最长公共前缀的长度一定大于或等于mid,如果不相同则最长公共前缀的长度一定小于mid,通过上述方式将查找范围缩小一半,直到得到最长公共前缀的长度。依次遍历字符串数组中的每一个字符串,对于每个遍历到字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。
2023-07-11 20:30:12
1259
原创 LeetCode 每日一题 2023-06-30 2490. 回环句 Java
【代码】LeetCode 每日一题 2023-06-30 2490. 回环句 Java。
2023-06-30 13:17:39
408
原创 【动态规划】LeetCode 583. 两个字符串的删除操作 Java
我的代码,错误代码,只考虑到了字母出现的次数,没有考虑到两个字符串中字母出现的顺序给定两个字符串word1和word2,分别删除若干字符之后使得两个字符串相同,则剩下的字符为两个字符串的公共子序列。为了使删除操作的次数少,剩下的字符应尽可能多。当剩下的字符为两个字符串的时,删除的操作的次数最少。因此,可以计算两个字符串的最长公共子序列的长度,然后分别计算两个字符串的长度和最长公共子序列的长度之差,即为两个字符串分别需要删除的字符数,两个字符串各自需要删除的字符数之和即为最少的删除操作的总次数。
2023-06-30 11:45:38
371
原创 代码随想录 回溯算法 Java
文章目录组合(*中等)77. 组合(*中等)17. 电话号码的字母组合(中等)39. 组合总和(中等)40. 组合总和II(中等)216. 组合总和|||分割(*中等)131. 分割回文串(*中等)93. 复制IP地址子集(中等)78. 子集(中等)90. 子集II排列(中等)46. 全排列(中等)47. 全排列II棋盘问题HDU - 2553 N皇后问题(困难)51. N皇后(困难)37. 解数独其他(中等)491. 递增子序列(*困难)332. 重新安排行程 欧拉回路/欧拉通路组合(*中等
2023-06-22 17:01:00
596
原创 代码随想录二叉树 Java(三)
显然,p和q的最近公共祖先就是从根节点到它们路径上的【分岔点】,也就是最后一个相同的节点。一个一个删除太繁琐了。表示,x节点的左孩子和右孩子均包含p节点或q节点,如果左子树包含的是p节点,那么右子树只能包含q节点,反之亦然,因为p和q节点都是不同且唯一的节点,因此,如果满足这个条件,就可以说x是最近的公共祖先。如果根节点不为空,则将val从根节点开始比较,如果val的值大于根节点的值,则移动到该二叉树的右节点,如果val的值小于根节点,则移动到该二叉树的左节点,并使用一个变量pre记录当前节点的父节点。
2023-06-15 14:53:24
814
原创 代码随想录 二叉树 Java(二)
文章目录(*中等)222. 完全二叉树的节点个数(*简单)110. 平衡二叉树(*简单)257. 二叉树的所有路径(简单)404. 左叶子之和(简单)513. 找树左下角的值(简单)112. 路径总和由第112题 二叉树 递归 小结(中等)113. 路径总和II(*中等)106. 从中序与后序遍历序列构造二叉树(中等)105. 从前序与中序遍历序列构造二叉树(中等)654. 最大二叉树(简单)617. 合并二叉树(简单)700. 二叉搜索树中的搜索(中等)98. 验证二叉搜索树(简单)530. 二叉搜索树的
2023-06-13 09:19:53
844
原创 代码随想录 二叉树 Java (一)
文章目录(简单)144. 二叉树的前序遍历(简单)94. 二叉树的中序遍历(简单)145. 二叉树的后序遍历二叉树的统一遍历方法(参考代码随想录)(中等)102. 二叉树的层序遍历(中等)107. 二叉树的层序遍历II(中等)199. 二叉树的右视图(简单)637. 二叉树的层平均值(中等)429. N叉树的层序遍历(中等)在每个树行中找最大值(中等)116. 填充每个节点的下一个右侧节点指针(中等)117. 填充每个节点的下一个右侧节点指针II(简单)104. 二叉树的最大深度(简单)111. 二叉树的最
2023-06-04 09:38:47
867
原创 代码随想录 字符串 Java
假设原字符串S是由子串s重复N次而成的,则S+S则有子串s重复2N次,那么现在有S=Ns,S+S=2Ns,其中N>=2。我的思路:2k个字符为一组,先将前k个字符(或者不足k个字符)添加到StringBuilder中,然后调用reverse()方法,然后再将后k个字符(或者不足2k个字符)添加到StringBuilder中,最后在将这一组作为一个整体,添加到答案中。在不同的编程语言中,这些函数是不一样的,主要的差别是有些语言的字符串不可变(如Python、Java),有些语言的字符串可变(如C++)。
2023-05-23 18:32:56
631
原创 代码随想录 哈希表 Java
由于字符串只包含26个小写字母,因此,可以维护一个长度为26 的数组,先遍历记录字符串s中字符出现的频次,然后遍历字符串t,减去数组中对应的频次,如果出现某一数组元素小于0的情况,则说明t包含一个不在s中的额外字符,返回false。初始时,两个指针分别指向两个数组的头部。可以借鉴三数之和中,代码随想录提供的思路,首先对数据进行排序,然后固定前两个数字,后两个数字的确定使用双指针的方法,但是每一个nums[i]的最大值是10^9,所以四个数相加会超过int的范围,所以需要使用long型进行接收。
2023-05-20 06:56:17
640
原创 代码随想录 LeetCode链表篇 Java
用head表示原始链表的头节点,新的链表的第二个节点,用newHead表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是newHead.next。如果temp的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。根据栈【先进后出】的原则,弹出栈的第n个节点就是需要删除的节点,并且,目前栈顶的节点就是待删除节点的前驱节点。如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点编程新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。
2023-05-15 10:24:07
557
原创 代码随想录 LeetCode数组篇 螺旋矩阵II Java实现
因为我是先做的JZ29,所以看到这题的时候,几乎就是一样的题,代码都几乎一样,思路解析在下一节JZ29中。我用了visit标记数组,标记是否访问过这个位置。思路和JZ29是一样的,代码几乎也是一样的。这是一道模拟题,就按照正常思路模拟即可。牛客官方的代码写的比我这个要更简洁一些。使用变量cnt记录当前访问过几个。
2023-05-09 14:52:13
414
原创 归并排序 Java
当两个子数组都有序以后,“划分”这个阶段就结束了,需要开始“合并”,初始化一个right-left+1长度的数组,临时存放合并的结果,合并完成后,在将临时数组中的值,赋到原来的数组中。将一个数组不断地一分为二,直到划分后的子数组的长度小于等于2时,不用再划分,如果子数组长度等于2,那么需要比较这两个元素的大小关系,如果子数组长度等于1,那么直接返回上一层。比如,在数组长度较短时,可以直接使用插入排序。对于归并排序,还可以继续优化。
2023-05-09 13:45:56
74
原创 海康威视 2024届实习生 应用软件开发工程师 Java 在线笔试
笔试过程中需要打开摄像头和共享屏幕,并且,代码编写就是在一个类似于记事本的文本输入框中写代码…没有提示,没有高亮,啥也没有…18道选择题(十几道)
2023-05-09 08:39:21
1636
原创 代码随想录 LeetCode数组篇 长度最小的子数组
暴力法,最直观的方法。初始化子数组的最小长度为无穷大,枚举数据nums中的每个下标为子数组的开始下标,对于每个开始下标i,需要找到大于或等于i的最小下标j,使得从nums[i]到nums[j]的元素和大于等于target,并更新子数组的最小长度(此时子数组的最小长度是j-i+1)然后遍历字符串s,check()函数用来检验当前left到right的区间内的字符是否已经覆盖了字符串t,就是比较当arrt数组不为零的那些位置,arrs数组中的元素是否大于等于arrt数组中的那些位置,如果相等,则覆盖字符串t。
2023-05-06 13:53:07
655
原创 代码随想录 LeetCode数组篇 移除元素
如果赋值过来的元素恰好也等于val,可以继续把右指针指向的元素赋值过来(左指针left指向的等于val的元素的位置继续被覆盖),直到左指针指向的元素的值不等于val为止。p指针指向当前要操作的位置,如果当前位置的数值不等于0,那么p后移一位,如果p指向的当前位置为0,那么就需要找出在p后面的不为0的数的位置q,将其值赋值到p的位置,并将q的位置赋值为0。在题目中提到,元素的顺序可以改变,当要移除的元素恰好在数组的开头,可以将数组中的最后一个元素移动到数组的开头,取代要删除的元素。
2023-05-06 09:05:41
585
原创 代码随想录 LeetCode数组篇 二分查找
题目链接我的思路:按照传统二分查找的方式,找到等于target的数组的下标,然后向两边扩展,如果没找到直接返回[-1,-1]//如果数组长度是0,则不用判断 if(nums == null || nums . length == 0) {} //如果target的值小于第一个元素或者大于最后一个元素,也不用判断 if((target < nums [ 0 ]) ||(target > nums [ nums . length - 1 ])) {left --;right ++;
2023-05-01 13:59:43
540
原创 LeetCode 8 字符串转换整数(atoi) 字符串模拟 Java实现
这个题目没有考察算法知识,模拟的是日常开发中对原始数据的处理,算法的时间复杂度:O(N),这里N为字符串的长度。
2023-04-30 10:45:08
161
原创 LeetCode 每日一题 2023-04-29 2423. 删除字符使频率相同(Java实现)
遍历该数组,尝试将某一位置上的非零元素值减一,在将减一后的,所有非零元素放入set集合去重,如果set集合的大小为1,那么就说明是满足条件的返回true。题目中提到,只有小写字母,可以考虑开辟长度为26的整型数组,记录每一个字母出现的次数,如果数组元素是0,那么就说明字符串中没有出现该字母。注意,在对某一数组元素减一后,如果set集合的大小不为1,记得要把那个位置上的数再加一,变回原来的状态。当遍历了所有元素后,都没有发现符合条件的情况,则返回false。
2023-04-29 20:16:36
132
原创 SpringBoot2入门 第一个HelloWorld(参考尚硅谷SpringBoot2零基础入门教程)
SpringBoot HelloWorld
2023-02-27 20:07:58
279
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人