LeetCode 剑指Offer
文章平均质量分 60
赵jc
这个作者很懒,什么都没留下…
展开
-
翻转单词面试常考题
翻转单词面试常考题仅仅反转字母反转单词(顺序改变)反转单词(顺序不变)仅仅反转字母https://leetcode-cn.com/problems/reverse-only-letters/class Solution { public String reverseOnlyLetters(String S) { StringBuilder ret = new StringBuilder(); int j = S.length() - 1; for原创 2021-10-08 11:20:50 · 102 阅读 · 0 评论 -
括号常考面试题
括号常考面试题括号匹配带*的括号匹配括号生产一级目录二级目录三级目录括号匹配https://leetcode-cn.com/problems/valid-parentheses/class Solution { public boolean isValid(String s) { if(s == null || s.length() == 0) { return false; } int len = s.length();原创 2021-09-24 22:26:34 · 208 阅读 · 0 评论 -
数组常见面试题
数组中数字出现的次数数组中出现次数超过一半的数字数组中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。数组中两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。数组中出现次数超过一半的数字https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/c原创 2021-09-24 11:33:09 · 1423 阅读 · 0 评论 -
合并区间常考面试题
合并区间合并区间合并区间合并区间https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a?tpId=117&&tqId=37737&&companyId=665&rp=1&ru=/company/home/code/665&qru=/ta/job-code-high/question-rankingpublic class Solution { public Ar原创 2021-09-04 11:25:58 · 124 阅读 · 0 评论 -
字符串常考面试题(大数相加)
这里写目录标题大数相加两数相加链表相加大数相加https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475?tpId=117&&tqId=37842&&companyId=665&rp=1&ru=/company/home/code/665&qru=/ta/job-code-high/question-rankingimport java.util.*;public cla原创 2021-09-03 16:55:10 · 232 阅读 · 0 评论 -
二分常考面试题
二分二分代码模板常见例题一级目录一级目录二级目录三级目录下面的题目都是基于整数二分,不要搞错哦!二分代码模板话不多说,直接上代码。bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1;原创 2021-04-23 23:29:41 · 358 阅读 · 0 评论 -
动态规划dp常考面试题(最长xxx)
动态规划dp三角形最小路径和最长增长子序列二级目录三级目录三角形最小路径和题目链接:https://leetcode-cn.com/problems/triangle///自底向上class Solution { public int minimumTotal(List<List<Integer>> triangle) { int n = triangle.size(); if (triangle == null || n == 0){原创 2021-05-14 17:37:36 · 721 阅读 · 2 评论 -
回溯面试常考题
回溯二叉树和为某一路径值没有重复数字的所有排列有重复数字的所有排列字符串的排列二叉树和为某一路径值https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/class Solution { List<List<Integer>> ret = new LinkedList<>(); LinkedList<Integer> path原创 2021-09-01 23:09:41 · 190 阅读 · 0 评论 -
链表相关面试题
链表相关面试题相交链表反转链表合并两个有序链表从有序链表中删除重复节点Ⅰ删除链表的节点删除链表的倒数第n个节点交换链表中的相邻节点链表求和回文链表分隔链表链表元素按奇偶聚集复杂链表的复刻相交链表 //暴力解法 class Solution { public int getL(ListNode cur) { if(cur==null) return 0; int len=0; while(cur原创 2021-04-23 23:44:06 · 577 阅读 · 0 评论 -
树Tree相关面试题
Tree二叉树的最大深度平衡二叉树翻转一棵二叉树。二叉树中和为某一指的路径(回溯)重构二叉树一级目录一级目录一级目录一级目录一级目录一级目录二级目录三级目录二叉树的最大深度题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 **[3,9,20,null,null,15,7],示例: 3 / \ 9 20 / \ 15 7返回它的最大深度 3代码:原创 2021-04-23 23:21:15 · 773 阅读 · 0 评论 -
手把手带你刷剑指offer
剑指offer题解二维数组中查找一级目录一级目录一级目录一级目录二级目录三级目录根据牛客的顺序来刷的,附上链接:https://www.nowcoder.com/ta/coding-interviews二维数组中查找核心思路:二分public class Solution { public boolean Find(int target, int [][] array) { if(array == null || array.length == 0 ) {原创 2021-04-23 23:19:16 · 1387 阅读 · 0 评论 -
剑指Offer16数值的整数次方
数值的整数次方问题描述分析AC代码不写不知道,一写啥也不会。原来还有个快速幂这个玩意,真的是学无止境。问题描述问题链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/分析问题很简单,就是自己实现一个pow函数,第一想法是写一个for循环一直乘,最后在判断一下指数为负的情况便完事了。class Solution { public double Power(double x, int n) {原创 2021-02-07 15:42:25 · 202 阅读 · 0 评论 -
剑指offer7重建二叉树
重建二叉树问题来源分析AC代码问题来源问题链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/分析我们是用递归来解决的,根据前序遍历和中序遍历的特点我们主要分为两个步骤:用前序遍历找根(定义一个索引preIndex遍历前序遍历的数组)new一个新节点将其此时posIndex索引指向的值保存起来(构建树)用中序遍历找根的左子树和根的右子树(写一个finVal函数用于在中序遍历中找到前序遍历索引指向的元素,然后返回在中序原创 2021-01-29 18:34:38 · 310 阅读 · 0 评论 -
剑指offer66二叉搜索树和双向链表
二叉搜索树和双向链表问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/分析题目虽然短短的两行字,但真心不简单(哭)。这道题的关键是二叉搜索树树的中序遍历。首先什么是二叉搜索树呢?就是根的左子树的值全部小于根节点的值,根的右子树的值全部大于根节点的值(递归下去,其左子树与右子树也满足该性质)巧的是二叉搜索树的中序遍历是递增的,刚好满足题目的排序要原创 2021-01-28 22:39:10 · 114 阅读 · 1 评论 -
剑指offer68二叉树的最近公共祖先
二叉树的最近公共祖先问题描述分析AC代码问题描述问题链接:https//leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/):分析抓住题目的两个重点。最近和公共祖先。最近不难理解,主要是公共祖先了(我们可以简单的理解为两个节点的向上的第一个交点)我们可以参照下图,图中红色圈出来的节点即为公共的祖先节点。我们大致可以分为2种情况根节点本身就是p或者q的其中一个,那么根节点就是最近公共祖先原创 2021-01-28 15:57:58 · 204 阅读 · 1 评论 -
LeetCode144二叉树的前序遍历
二叉树的前序遍历问题描述分析AC代码问题描述问题描述:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/分析题目的要求简单明了,就不在分析了。前序遍历(根左右嘛)这道题重点是返回值是List,我们需要将结果存起来。我们的大致思路是递归遍历,我们可以分为子问题解决和遍历思路来解决。遍历思路:先new一个list,然后以根左右的顺序进行递归遍历,为根时将此时的root的val添加到list当中,最后返回list即可。原创 2021-01-26 18:36:28 · 226 阅读 · 0 评论 -
LeetCode155最小栈
最小栈问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/min-stack/分析我们可以借用两个辅助栈来解决这个问题,一个为普通栈stack,一个为用于存储最小元素的栈minstack。入栈push():不管三七二十一,先将元素压入普通栈中,接下来如果最小栈minstack为空的话也将这个元素压入,如果不为空的话,将此时的x与普通栈的栈顶元素进行比较,如果小于等于的的话,将这个元素也压入minstack(保证minstack栈顶元素存放的是原创 2021-01-25 21:32:26 · 173 阅读 · 1 评论 -
LeetCode232用栈实现队列
用栈实现队列问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/implement-queue-using-stacks/分析因为栈和队列的特点不一样,我们用一个栈很难实现,所以需要用两个栈来实现队列。一个栈s1代表入队列,另一个栈s2代表出队列。入队列push():无脑的将元素压入到栈s1当中出队列pop():从栈s2中取栈顶的元素即可,如果栈s2为空的话,判断栈s1是否为空,如果为空的话返回false,如果不为空的话,将栈s1的所有元素原创 2021-01-25 20:29:32 · 187 阅读 · 0 评论 -
LeetCode225用队列实现栈
用队列实现栈问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/implement-stack-using-queues/分析首先我们要明确栈的特点是先进后出,而队列的特点是先进先出,我们不可能用一个队列来完成这个操作,所以我们需要用两个队列来完成。我们主要关心入栈(push)和出栈(pop)即可。有两个队列,我们时刻要保证一个队列为空,这是解题的关键。入栈push():最开始的情况,两队列都为空,我们随便选一个队列插入元素即可offer(原创 2021-01-25 17:39:41 · 208 阅读 · 1 评论 -
LeetCode20有效的括号
有效的括号问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/valid-parentheses/分析我们可以采用辅助栈来解决这个问题。循环遍历字符串,如果是左半部分则压入栈,如果是右半部分先判断栈是否为空,如果为空则直接返回(代表第一个元素为右半部分,或者右括号多)如果不为空,此时栈顶元素一定为右半部分,将栈顶元素与压入的左半部分比较,如果相等直接弹出,继续循环,如果不相等直接返回false循环遍历完成后,如果栈为空则表示匹配返回tr原创 2021-01-24 22:13:21 · 218 阅读 · 0 评论 -
剑指offer31栈的压入弹出序列
栈的压入弹出序列问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/分析我们可以新开批一个辅助栈Stack来解决这个问题。遍历压入序列,先将第一个元素压入辅助栈stack,然后定义一个索引index指向弹出序列的第一个元素判断辅助栈的栈顶元素是否等于此时弹出序列索引指向的元素,如果等于则将辅助栈栈顶的元素弹出,索引index++;如果如想等的话继续将压入序列的下一个元素入栈原创 2021-01-23 20:02:29 · 144 阅读 · 0 评论 -
LeetCode139单词拆分
单词拆分问题描述分析AC代码问题描述问题链接:https://leetcode-cn.com/problems/word-break/分析这道题可以采用动态规划来解决。问题:单词是否可以成功分割子问题:单词前几个字符是否可以成功分割状态F(i):单词前i个字符是否可以成功分割转移方程:这里的转移方程就不是等式了,而是搜索。第一步:先判断i之前是否有F(j)=true,如果没有直接返回false,如果有的话继续第二步:再在 j+1到i区间内查找是否有字典里包含的单词,如果有返回tru原创 2021-01-16 17:17:49 · 199 阅读 · 0 评论 -
剑指offer从头打印链表
从头打印链表题目描述分析AC代码题目描述分析题目要求从头到尾反向输出每个节点的值(并用数组返回),看到官方的题解是用栈来解决的(栈先进后出的特点),但自己目前还没有接触到,所以先用一个时间复杂度和空间复杂度复杂的方法吧,之后学到了再补充。第一步,先遍历链表求出链表长度len第二步,new一个len大小的数组第三步,将结点的每一个值都存到数组中(注意,从后往前存)返回数组即可AC代码class Solution { public int[] reversePrint(ListN原创 2021-01-15 20:20:23 · 167 阅读 · 1 评论 -
剑指offer42连续子数组的最大和
连续子数组的最大和问题描述分析AC代码问题描述分析我们可以采用动态规划(dp)来解决这道题。问题:求所有子数组的最大值(连续整数)状态:F[i]以第i个元素结尾的最大连续子序列和转移方程:F[i]=max(F([i-1]+A[i],A[i])初始状态:F[0]=A[0]返回值:F[i]注意:因为题目中是一个或连续多个整数组成一个子数组,所以状态一定要设置为以第i个元素结尾的最大连续子序列和才可以。然后转移方程的话,F[i]需要与取F[i-1]+A[i]和A[i]的最大值才行,如果加上原创 2021-01-13 21:18:13 · 240 阅读 · 0 评论 -
LeetCode989数组形式的整数加法
LeetCode的这道题感觉比较有意思,记录一下。问题描述:当第一眼看到这个题目时感觉很简单,但实际完成时还是花了一点功夫。这道题可以大致分为三个部分来完成。一.确定相加后整数有几位,并开辟相应大小的空间二.将两数相加,并且存到新开辟的数组中去三.反转数组接下里我们来具体分析一下第一步:首先我们我们需要确定相加后整数的是几位数,根据位数开辟相应的空间即可。数组的大小我们几位ASize,我们只需求出K是几位数即可(用一个while循环便可实现),在与数组的位数进行比较即可。第二步:将原创 2020-10-14 23:38:11 · 209 阅读 · 0 评论 -
剑指offer青蛙跳台阶问题(普通跳和变态跳)
今天脑子里全是这个青蛙(呱呱呱)。有个普通的青蛙,还有一个变态的青蛙。我们来看一下吧。普通青蛙一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。- 分析1斐波那契额递归实现如果n=1,只有一种跳法,那就是1如果n=2,那么有两种跳法,2,[1,1]如果n=3,那么有三种跳法,[1,1,1],[1,2],[2,1]如果n=4,那么有五种跳法,[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]如原创 2021-01-09 22:12:55 · 523 阅读 · 1 评论 -
LeetCode61旋转链表
分析题目中说的是旋转,但其实本质上是将尾部向前数第K个元素作为头,原来的头接到原来的尾上我们可以用快慢指针来解决这个问题。cur当前节点(用于遍历链表,得到链表的长度)k代表链表的长度newHead旋转后链表的头部fast(快指针)slow(慢指针)具体思路我们先计算链表的长度,用k=k%count得出新的k值(效果是一次样的,避免多走)然后让fast走k步,然后fast和slow一起走当fast.next=null时停下,此时slow.next是旋转后链表的头(slow.nex.原创 2021-01-08 22:18:57 · 325 阅读 · 0 评论 -
LeetCode142环形链表找入口节点
分析这道题在之前那道判断链表是否有环的基础上增加了寻找入口节点的位置。首先无环的话直接返回null有环的话返回环入口节点的位置这里只分析有环后如何求位置,判断是否有环可以参考前面的文章。求这个位置的话有涉及到数学的追击问题了(哭),下面结合图来理解C代表环的长度fast==slow的相遇点到入口点的距离为L链表头部head到入口点的距离为X本题的核心:slow在环内只走一圈便会被fast追上(就会相遇,如果一圈都没追上的话,那slow再走多少圈也不会被追上)所以slow走的.原创 2021-01-08 10:26:23 · 266 阅读 · 0 评论 -
LeetCode141环形链表
分析我们可以采用快慢指针来解决。让fast一次走两步fast=fast.next.next;(为什么是两步而不是散步或者四步呢,大家可以想一想),让slow一次走一步 slow=slow.next;,如果有环(则会有fast==slow)。注意:如果一次走三步或者一次走四步的话,当环很小时,fast可能会每次与slow错过,经过好久之后才会想等。而fast一次走两步的话,会使错过的几率变小(不用一直绕着环走),如果有环的话,能早一点得到fast==null。结合图来理解一下一起走fast==sl.原创 2021-01-07 17:30:56 · 175 阅读 · 2 评论 -
剑指offer 回文链表
分析我们可以分三步来解决这个问题。快慢指针找中点反转后半部分判断前半段与翻转后的后半段是否相同第一步:快慢指针找中间节点fast(快指针一次走两步)slow(满指针一次走一步)第二步反转后半部分prev(当前slow节点的前驱,用于反转链表)slowNext(当前slow的下一个节点,用于反转链表)第三步判断前半段与翻转后的后半段是否相同代码如下:class Solution { public boolean isPalindrome(ListNode .原创 2021-01-07 14:20:49 · 188 阅读 · 0 评论 -
LeetCode160相交链表
分析如果不相交则直接返回null如果两个链表相交,则相交后面的部分一样我们不用考虑,所以我们只需要考虑前面即可。解法如果两个链表等长的话分别遍历两个链表,判断所向的节点是否相等。如果不等长的话,可以先让长的链表走两个链表长度的差值,在继续上一步即可。pl(plong长链表)ps(pshort短链表)k两个链表的差值结合图来分析:不相交相交先让pl走k(差值)步在让ps和pl一起走代码如下:public class Solution { publ.原创 2021-01-07 13:41:53 · 169 阅读 · 0 评论 -
LeetCode 面试题02.03 删除中间的节点
怎么说呢,这道题不难,但重点在于理解。不然就像我一样gg(想了好久才想通,已哭晕在厕所)觉得需要记录一下这道题。分析:删除单向链表中间的某个节点,既不是头也不是尾(这个非常关键),且只能访问该节点(这又是一个坑,说明不能遍历),而且传入的参数是node,而不是head。解法既然只能访问当前节点,那就只好出此下策了。杀不掉我,我就变成你,然后再干掉你,就等于杀死了自己。node.val=node.next.val;node.next=node.next.next;下面结合图来理解一下.原创 2021-01-06 22:42:07 · 222 阅读 · 0 评论 -
LeetCode21合并两个有序链表
分析首先题目中的关键词是升序,我们可以new一个新节点(newHead)来当返回链表的头,然后遍历链表A和B,比较其val,将小的节点连接到newHead后面即可。newHead(新返回链表的头)tmp(tmp=newHead)用于连接headA和headB传来的节点注意如果两个链表不等长的话,一个遍历完为空后,便可将另一个剩下的部分直接连接到tmp后面(因为两个链表都是升序的)结合图来理解一下:开始尾部代码如下:class Solution { public List.原创 2021-01-05 21:01:31 · 260 阅读 · 1 评论 -
剑指Offer链表分割
题目描述现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。分析可以新new两个节点,一个连接比x值小的节点(before)一颗连接比x大的节点(after)。最后将两个新的链表一连接即可。具体如下:cur(cur=head,遍历链表)bs(beforeStart小于x的节点的起始位置)be(beforeEnd小于x的节点的结束位置)as(afterStart大于x的节点的起原创 2021-01-05 18:46:10 · 173 阅读 · 0 评论 -
剑指offer链表中倒数第K个节点
第一种方法看到这道题的第一想法便是先求一下链表的长度(size),然后再根据一些判断条件遍历链表走到相应的位置即可。分析:我们要找倒数第k个节点,那么只需要走到size-k的位置即可。(可以简单的记为相加等于size)如下图:我们可以将链表看成一个数组,我们要找倒数第2个节点,我们只需要走5-2=3步即可.代码如下:public class Solution { public int getSize(ListNode head) { int count=0; .原创 2021-01-03 22:54:20 · 256 阅读 · 0 评论 -
LeetCode138:复制带随机指针的链表
还没有学到哈希,所以官方给的题解不太懂。然后想到了另一种方法。先来分析一下这道题吧。这道题的关键在于复制随机指针这题的最大难点就在于复制随机指针,比如下图中节点1的随机指针指向节点3节点3的随机指针指向节点2节点2的随机指针指向空我们可以分为三步来解决。第一步:根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面,比如下图中原节点1不再指向原原节点2,而是指向新节点1第二步是最关键的一步,给新链表的随机指针赋值上图中,我们可以观察到这么一个规律原结点1的随机指.原创 2020-12-30 14:34:03 · 234 阅读 · 0 评论 -
Leetcode 203.移除链表中的元素
链表的题我们如果没思路的话画图就完事了。链表中我们需要关注三个主要的位置,头,尾,和中任意位置下面我们来画图解释一下。我们可以使用双指针来解决这个问题,cur代表当前节点(从head.next开始),prev代表当前节点的前驱(prev=head),(我们先不考虑第一个节点)我们让cur一直往下走,每走一次判断一下当前cur.val是否等于传参传入的value。如果相等的令prev.next=cur.next;(就相当于删除了这个值相等的节点),然后接着走(cur=cur.next),如果不想的.原创 2021-01-01 13:07:38 · 3220 阅读 · 8 评论 -
Leetcode206反转链表
还是之前说的链表的题画图就完事了,重点考虑头、尾、和中间即可。第一种方法我们可以采用三指针来解决这个问题。我们定义三个引用,cur表示当前节点(从head开始cur=head),prev表示当前节点的前驱(最开始赋值为null),curNext表示cur的下一节点(curNext=cur.)然后关键在于如何连接和遍历下去。我们先将cur.next=prev;(反转了一个),在更新条件接着往下走即可:prev=cur;cur=curNext;这里我们就需要特别注意最后一个节点了,因为我们要反转所有节.原创 2021-01-01 22:56:09 · 350 阅读 · 0 评论 -
LeetCode876链表的中间节点
这道题还是比较简单的,最开始的思路是求一下链表的长度length,然后从头开始走length/2即可,当感觉不是很好。便想到了快慢指针的解法。我们定义两个引用fast和slow(都等于head开始),我们让fast一次走两步(fast=fast.next.next),slow一次走一步**(slow=slow.next)**,这样当fast走完时slow刚还走到一半,此时返回slow即可。但在循环条件的判断上还有一些细节需要我们注意,下面画图来说明。开始中间结尾while的判断条件必须是 .原创 2021-01-01 23:40:10 · 198 阅读 · 0 评论 -
剑指offer删除链表中重复的节点
由题可知链表是排好序的,且重复的节点不做保留。我们肯定是需要遍历链表的,所以cur必不可少(cur=head),在原有链表进行操作的话有点复杂,所以接下来我们可以new一个新节点newHead用来接收数据。然后我们遍历链表,如果cur.val==cur.next.val(重复节点),则继续向下遍历(cur=cur.next),(但可能重复节点有好多个,则需要一个循环),且当结束循环时还需要向下走一步(cur=cur.next) if(cur.next!=null&&cur.val==c.原创 2021-01-05 15:19:46 · 183 阅读 · 0 评论