
面试
文章平均质量分 61
SP_1024
这个作者很懒,什么都没留下…
展开
-
我的创作纪念日
最初是开始学习算法知识,为了找到一个好的线上笔记,方便在手机上随时查看代码,用来复习,后来发现,csdn 的文本编辑功能,用起来很舒服,markdown的编辑风格也很好,很适合写学习笔记.就这样一直坚持边学习边写笔记,算是对自己的一个总结,也把自己的路线图展示出来.在学习算法的过程中,我不仅掌握了一些经典算法,而且对算法有了更深的理解和认识。每天写一到两到leetcode 算法题,保持自己的刷题感觉,还有经常要看一些好的博客,好的解题思路,解题技巧,不断改善解题技巧,找到最优的算法,学习算法的背景和目标。原创 2023-08-09 18:36:43 · 148 阅读 · 0 评论 -
java--Http请求发送json报文
【代码】java--Http请求发送json报文。原创 2023-06-15 18:04:44 · 1801 阅读 · 0 评论 -
递归--字符串的全部子序列和不重复的子序列(java)
全部子序列就是把abs 这个字符串全部拆成单个char字符,每个位置都有可能选,有可能不选。过程和上面一样,只需要把返回的结果用HashSet 去重一下就行了,直接看代码吧,不解释了。因此递归就有了,这个位置上的字符选和不选两种情况,都要递归。字序列是: “” , s , b , bs, a。示例: String str = “abs”;原创 2023-05-27 15:45:17 · 717 阅读 · 0 评论 -
leetcode--分隔链表(java)
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。建立两个临时链表,一个用来链接小于给定值的节点,一个来链接大于等于的节点,然后再将两个链表连接在一起。>输入:head = [1,4,3,2,5,2], x = 3。你应当 保留 两个分区中每个节点的初始相对位置。输入:head = [2,1], x = 2。链表中节点的数目在范围 [0, 200] 内。输出:[1,2,2,4,3,5]原创 2023-05-27 14:27:11 · 1730 阅读 · 0 评论 -
leetcoe--合并 K 个升序链表(java)
这个和两个有序链表合并原理其实是一样的,只是多个链表,我们就不好进行直接比较了,输入:lists = [[1,4,5],[1,3,4],[2,6]]因此我们借助一个数据结构,小根堆。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。我们把节点信息加进去,他会自动帮我们排好。输出:[1,1,2,3,4,4,5,6]将它们合并到一个有序链表中得到。输入:lists = [[]]这样我们就可以直接去连节点了。输入:lists = []原创 2023-05-27 11:26:18 · 2413 阅读 · 0 评论 -
leetcode--删除链表的倒数第N个节点(java)
2.让指针2从头开始和指针1一起走,当指针1走完。指针2来到k-n位置,就是要删除的节点。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。删除倒数第N 个点,N 小于等于链表的长度,假设链表总厂K。输入:head = [1,2,3,4,5], n = 2。我们要删除的位置就是K - N 的位置上的节点。输入:head = [1,2], n = 1。1.先让指针1走K 步,链表还剩K-n 步。输入:head = [1], n = 1。输出:[1,2,3,5]链表中结点的数目为 sz。原创 2023-05-27 10:24:45 · 2056 阅读 · 0 评论 -
递归--汉诺塔问题(java)
第一步就是整体思维,我要完成这个任务,我让你递归去一直重复,直到完成这个功能,第三步:我们把第一步的N -1 个在中间的盘子移到右边,这就完成了.网上很多博客讲的太详细,反而看不懂,建立起整体思维.就三步就能完成.挪动过程中不能大的压在小的上面,把挪动的过程打印出来.第一步:我们把N -1 个盘放到中间柱子上,第二步肯定都能懂,怎么理解第一步和第三步呢.就像大象装冰箱总共分三步一样,这里也是三步。第二步:我们把第N 个盘子依=移到最右边,用递归解题就要建立一个整体思想.原创 2023-05-26 23:16:28 · 143 阅读 · 0 评论 -
合并两个有序链表(java)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。然后再借助一个辅助链表进行大小串联起来,最后返回这个辅助链表就可以了。代码很简单,直接看代码吧。两个链表是有序的,那我们用两个指针分别卡住两个链表,进行大小比较,输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]原创 2023-05-26 15:43:42 · 2960 阅读 · 0 评论 -
leetcode--环形链表.找到入环节点(java)
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。3.相遇后,快指针回到头节点,然后改成每次走一步,慢指针还是走一步。2.有环时,使用快慢指针法,快指针一次走两步,慢指针一次走一步,一定会在环内相遇,1.环形链表没有尾结点,会在环里循环,因此,如果能走到null ,就表示无环,解释:链表中没有环。原创 2023-05-26 11:10:19 · 3146 阅读 · 0 评论 -
镜像二叉树和求二叉树最大深度(java)
题目描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。这题用递归就很简单,递归左树和右树时,将左右交换下,直接代码演示。使用递归去获取左树和右树的高度,取最大的加顶点1,就是最大高度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。给定一个二叉树,找出其最大深度。返回它的最大深度 3。原创 2023-05-26 09:50:18 · 2678 阅读 · 0 评论 -
逆序一个栈,不使用额外的数据结构,用递归函数解决(java)
r如果有一个栈,从栈顶到栈底依次是12345 ,那么逆序后,从栈顶到栈底就是54321,不能使用额外的数据结构去辅助处理.我们先定义一个递归过程.每次把栈底元素弹出.再然后再定义一个递归过程,每次去拿到弹出的元素.弹到最后,再依次压进栈中.原创 2023-05-26 00:08:50 · 138 阅读 · 0 评论 -
LeetCode:相交链表(java)
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。原创 2023-05-25 19:11:02 · 1403 阅读 · 0 评论 -
LeetCode: 二叉树的直径(java)
用递归方式去解题,递归左树和右树时,用一个变量去保存最长距离,然后每次递归时返回当前最左树和右树比较下来的最大值。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。这条路径可能经过也可能不经过根节点 root。解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。给你一棵二叉树的根节点,返回该树的 直径。两节点之间路径的 长度 由它们之间边数表示。输入:root = [1,2,3,4,5]树中节点数目在范围 [1, 104] 内。输入:root = [1,2]原创 2023-05-25 18:45:02 · 2207 阅读 · 0 评论 -
二叉树:填充每个节点的下一个右侧节点指针(java)
就无法链接起来,因此我们要修改下递归过程,把左右树同时递归,这样在同一个过程里,就可以看见兄弟节点了。我们在递归的过程中,把层级结构也进行递归,每次把层级结构和左树的右节点放进map 中,在遍历到右树时,根据层级来判断,拿到左树,然后把它们相连,就完成了递归。和上面相比,少了一次递归。解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。输入:root = [1,2,3,4,5,6,7]输出:[1,#,2,3,#,4,5,6,7,#]原创 2023-05-25 15:27:40 · 1284 阅读 · 0 评论 -
lintcode-图的拓扑排序(java)
描述给定一个有向图,图节点的拓扑排序定义如下:对于图中的每一条有向边 A -> B , 在拓扑排序中A一定在B之前.拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点.针对给定的有向图找到任意一种拓扑排序的顺序.样例:输入:输出:解释:拓扑排序可以为:您只需要返回给定图的任何一种拓扑顺序。原创 2023-05-25 00:18:31 · 1072 阅读 · 0 评论 -
图的拓扑排序(java)
在计算机科学中,图的拓扑排序是一种经典的问题,也被称为顶点排序或顶点线性序列。拓扑排序的目的是将一个有向无环图(DAG)中的所有顶点排成一个线性序列,使得每个顶点在序列中都出现在它的所有后继顶点之前。换句话说,拓扑排序确定了一个有向无环图中的一种顶点线性顺序,使得每个顶点都排在其后继之前,后继是指从该顶点可以到达的所有顶点。拓扑排序的应用非常广泛,例如在网络流、编译器、电路设计等领域中,都需要对有向无环图进行拓扑排序操作。原创 2023-05-23 23:52:11 · 571 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树(java)
前序遍历头左右,第一个节点就是根节点,所以根据第一个节点,皆可以在中序遍历中找到头节点,根据中序遍历的头节点的下标值,刚好把树分为左树和右树,然后我们递归就可以构造出整棵树。给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输出: [3,9,20,null,null,15,7]原创 2023-05-23 19:14:58 · 1041 阅读 · 0 评论 -
leetcode二叉树中的最大路径和(java)
用递归的方式去处理这个问题,我们递归左树和右树时,每次递归,我们去比较一条链路是上的最大值,然后保存下这个最大值,然后在递归的代码里,我们每次要比较左树和右树哪个大,然后哪个去加上头节点的值,因为要形成一个链路,左树和右树我们只能选择一个。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。输入:root = [-10,9,20,null,null,15,7]原创 2023-05-23 19:00:09 · 943 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历(java)
利用点线的组合来实现图的结构,优势就是结构清晰,容易理解,表达的数据项多。便于很多图的算法。具体实现可以查看上期连接自定义图结构自定义图结构的代码/*** 线/*** 线的权重/*** 这个是点的结构 先理解为头节点/*** 理解为尾节点或者出节点。} } /*** 点的数据结构//出度 public int out;//入度 public int in;//边的集合(这个点的所有线段集合) public ArrayList < Edge > edges;原创 2023-05-23 15:08:03 · 442 阅读 · 0 评论 -
图结构-图的数据表示法(java)
思路:图有点和线组成,线上又可以有权重,那我们先把线定义出来,在定义出点,最后把线和点组成一张图,这种结构会比较清晰,比邻接矩阵法之类的更好理解。1.先定义出线段/*** 线/*** 线的权重/*** 这个是点的结构 先理解为头节点/*** 理解为尾节点或者出节点。} }2.定义出点信息/*** 点的数据结构//出度 public int out;//入度 public int in;原创 2023-05-22 15:57:04 · 910 阅读 · 0 评论 -
单链表删除指定数据的方法(java)
这里只需要一个构造方法就行.} }首先我们先创建一个随机的单链表/*** 生成随机的链表,才能保证代码写的健壮性,保证不会在特殊状态下出错,* @param len 长度范围* @param value 值的范围* @return//链表为null 的情况我们也要测试 return null;} rLen --;pre = cur;rLen --;再写一个打印的方法,方便排查问题while(head!i ++) {原创 2023-04-05 20:48:42 · 590 阅读 · 1 评论 -
随机快排的非递归实现方式(java)
随机快速排序(Randomized Quick Sort)是一种基于比较的排序算法,也称为选择排序。它的核心思想是每次从待排序的序列中随机选择一个元素,将其放到序列的起始位置,然后对序列进行递归排序,直到所有元素都被排序。原创 2023-04-16 00:04:30 · 263 阅读 · 0 评论 -
区间和的个数.采用归并排序和前缀和数组来解决(java)
/现在是计算合并时,右边前缀和,在左边有多少符合要求的. int windowL = l;// 起步都是l int windowR = l;//开始满足条件的个数为0 for(int i = m + 1;i原创 2023-04-17 22:23:46 · 137 阅读 · 0 评论 -
希尔排序和插入排序-速度比较(java)
希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序。它的基本思想是将待排序的序列划分成若干个子序列,对每个子序列进行插入排序,通过逐步缩小增量的方式,使得整个序列变为有序序列。原创 2023-04-25 19:36:58 · 468 阅读 · 0 评论 -
二叉树专题-按层遍历(java)
二叉树的按层遍历,也称为前序遍历或线性遍历,是一种基本的遍历二叉树的方式。它按照从上到下、从左到右的顺序遍历每一层节点。value = v;} }原创 2023-05-04 23:10:38 · 405 阅读 · 0 评论 -
leetcode-岛屿数量(Java实现)
我们在遍历这个二维数组时,每次遇到‘1’,我们就去判断这个位置的上下左右的四个位置上是不是还有1,这个就很像二叉树的递归,二叉树递归时,我们会递归左树,递归右树。把这个二维数组可以转换成并查集的形式,有’1’的位置我们就初始化成并查集的一个元素。然后把相邻的‘1’全部合并成一块,最后返回还剩几个集合,就是几个岛屿。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。grid[i][j] 的值为 ‘0’ 或 ‘1’此外,你可以假设该网格的四条边均被水包围。原创 2023-05-20 09:27:17 · 1027 阅读 · 0 评论 -
并查集专题--省份数量(java)
我们把当前的信息用并查集进行初始化,然后把所有相连的城市合并成一个集合.最后返回集合的数量就是省份的数量。原创 2023-05-18 22:52:22 · 153 阅读 · 0 评论 -
并查集专题--Map和数组两种方式实现并查集(Java)
并查集是一种数据结构,用于处理不相交集合的合并及查询问题。它是一种树型数据结构,每个节点代表一个集合,节点中存储该集合的所有元素,且每个节点指向它的子节点,按照元素的大小关系构成一个有向图。在并查集中,查找操作可以在常数时间内完成,而合并操作则需要使用一定的算法进行优化,通常是使用哈希表来实现哈希冲突解决,以减少时间复杂度。并查集在数据挖掘、图论等领域有广泛的应用,例如用于构建关联规则挖掘算法、社交网络分析等。原创 2023-05-18 22:40:38 · 572 阅读 · 0 评论 -
贪心算法-跳跃游戏问题(java)
1.1 题目描述输入是一个非负整数数组nums,数组元素nums[i]代表你站的位置i最多能够向前跳几步。现在你站的第一个位置nums[0],请问能否跳到最后一个位置。原创 2023-05-17 16:41:01 · 864 阅读 · 0 评论 -
贪心算法--计算项目最大收益(java)
输入正数数组costs、正数数组profits、正数K和正数M costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) K表示你只能串行的最多做k个项目 M表示你初始的资金 说明:每做完一个项目,马上获得的收益,可以支持你去做下一个项目,不能并行的做项目。输出:最后获得的最大钱数。1.按成本对项目排序,排序后,我们拿出资金进行比较可以做的项目。2.把能做的项目按收益进行排序,我们做收益最高的.原创 2023-05-16 22:47:44 · 868 阅读 · 0 评论 -
贪心算法--安排最多会议次数(java)
*** 会议 定义开始时间和结束时间.int start;int end;} }原创 2023-05-16 22:13:59 · 588 阅读 · 0 评论 -
贪心算法-分金问题,返回分割最小代价(java)
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。把数组里的数都放进小根堆里去,会从小到大排列好,然后每次弹出来两个,相加再放进去,重复这个过程,直到小根堆里只剩一个元素,停止,此时前面每次弹出数字的累加和,就是最小代价。也是类似上面的过程,上面是用小根堆,对顺序重构了,得到出最优解了,如果用递归的暴力方法,我们可以不去排序,直接暴力计算所有可能性,拿出最优解。这题用贪心解法,具体证明,不需要证明,证明很麻烦,只说思路。原创 2023-05-16 16:07:26 · 312 阅读 · 0 评论 -
贪心算法-用最少的灯照亮所有街道(java)
给定一个字符串str,只由’X’和’.'两种字符构成 ‘X’表示墙,不能放灯,也不需要点亮;’.'表示街道,可以放灯,需要点亮 如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮 返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。因为碰到墙不能放灯,所以我们就统计墙中间有多少街道,一个灯可以照亮三个街道,所以,每次碰到墙,就统计街道的数量,再下一个墙后面清零重新计算街道的数量,把灯的数量相加.原创 2023-05-15 23:22:31 · 518 阅读 · 0 评论