Java刷题
文章平均质量分 83
整理刷题题解与思路
楠枬
保持思考
展开
-
KMP 算法
KMP 算法是一种改进的字符串匹配算法,利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。文章介绍了KMP算法为什么不需要在主串中进行回退、如何计算next数组、next数组的优化以及如何查找所有匹配成功的起始位置原创 2024-10-20 09:00:00 · 2191 阅读 · 102 评论 -
BF 算法
BF算法:即暴力(Brute Force)算法,是一种模式匹配算法,将目标串 S 的第一个字符与模式串 T 的第一个字符进行匹配,若相等,则继续比较 S 的第二个字符和 T 的第二个字符;若不相等,则比较 S 的第二个字符和 T 的第一个字符,依次比较下去,直到得出最后的匹配结果原创 2024-10-16 09:00:00 · 2777 阅读 · 72 评论 -
二分查找算法
二分查找是一种高效的搜索算法,适用于在一组数据中中查找某个特定元素,其基本思路是通过不断将查找范围减半来快速定位目标元素。接下来,我们就通过具体的问题,来学习二分查找34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)原创 2024-10-02 09:00:00 · 953 阅读 · 45 评论 -
找到字符串中所有字母异位词、串联所有单词的子串
找到字符串中所有字母异位词:给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序原创 2024-09-26 09:00:00 · 713 阅读 · 33 评论 -
两数之和、三数之和、四数之和
若 nums[left] + nums[right] < target,此时 nums[right] 为最大值,不能再增加了,因此我们需要让 nums[left] 变大,因此 left++,让 nums[left] 增加。若 nums[left] + nums[right] > target,此时 nums[left] 为最小值,不能再减小了,因此,我们让 right--,减小 nums[right] 的值,从而让两数之和减小。原创 2024-09-24 09:00:00 · 1177 阅读 · 84 评论 -
双指针算法
双指针算法是一种常用的算法,主要用于处理数组和链表中的问题。特别是需要在集合中查找、排序或计算时,可以通过两个指针来优化时间复杂度和空间复杂度。双指针有两种常见的形式:对撞指针和快慢指针原创 2024-09-21 09:00:00 · 929 阅读 · 90 评论 -
动态规划——回文串问题
本篇文章主要学习使用动态规划来解决回文串相关问题,我们通过相关练习来学习。原创 2024-03-31 09:00:00 · 1512 阅读 · 29 评论 -
动态规划——路径问题
指在一个给定的网格中,从起点到终点有多条可能的路径,每条路径都有一个特定的权重或成本,动态规划路径问题的目标是找到一条路径使得其总权重或成本最小或最大化。在解决这类问题时,通常会使用动态规划算法,通过逐步计算子问题的最优解来找到整体问题的最优解。接下来,我们通过一些练习来进一步体会路径问题及其解决方法。原创 2024-03-25 09:00:00 · 1547 阅读 · 13 评论 -
动态规划——斐波那契问题(Java)
是一种常见的算法设计技巧,通常用于解决具有重叠子问题和最优子结构的问题。在动态规划中,将原问题分解成若干子问题,通过求解子问题的最优解来得到原问题的最优解。如何用动态规划解决问题?我们可以通过一下5步来解决动态规划问题1. 确定状态表示什么是状态表示?指在解决问题时所需要考虑和记录的关键信息。这些状态可以是问题的某种属性或特征,通过对这些状态的定义和记录,可以更好地理解问题的结构,从而设计出高效的动态规划算法。原创 2024-03-23 09:00:00 · 2031 阅读 · 26 评论 -
宽度优先搜索算法(BFS)
先从左向右,再从右向左地对每一层节点进行遍历以示例1为例:即。原创 2024-03-10 09:00:00 · 3150 阅读 · 36 评论 -
算法中栈的应用
即可得出结果:因此,我们可以使用一个栈来保存进行乘除运算后的值:当运算符为加号时,直接将加号后的元素num放入栈中当运算符是减号时,我们将减号后的元素num的。原创 2024-03-05 09:00:00 · 1275 阅读 · 28 评论 -
哈希表在算法题目中的应用(Java)
在本篇文章中,我们重点讲解哈希表在算法题目中的应用原创 2024-02-28 09:00:00 · 1530 阅读 · 18 评论 -
分治算法总结(Java)
即分而治之。也就是将一个大的问题拆分为若干个小问题,然后递归解决每个小问题,最终合并每个小问题的解得到原问题的解分治算法一般包含 三步:1. 分割问题:将原问题分割为若干子问题,这些子问题应该是相互独立的,并且和原问题具有相同的结构。2. 解决子问题:递归解决每个子问题,当子问题足够小时,直接求解3. 合并子问题的解:将子问题的解合并成原问题的解。分治的思想体现在 快速排序、归并、二分查找等 中,在本篇文章中,我们重点讲解其在 快速排序和 归并 中的使用。原创 2024-02-21 09:00:00 · 1981 阅读 · 30 评论 -
模拟算法总结(Java)
模拟:根据题目要求的实现过程进行编程模拟,即题目要求什么就实现什么1. 根据题目要求模拟算法流程2. 将算法流程转换为代码接下来,我们以几道练习来进一步理解和掌握模拟算法。原创 2024-02-16 09:00:00 · 2441 阅读 · 10 评论 -
位运算总结(Java)
关于位运算操作的总结和相关练习题目详解原创 2024-02-14 09:16:04 · 1009 阅读 · 11 评论 -
和可被K整除的子数组(Java详解)
类似于数学中的数列前n项和。即从首元素位置到i位置这个区间内所有元素之和,前缀和只是一种思路,其不仅可以求和,也可以求从首元素位置到i位置区间内的乘积等等。我们以示例1为例子,先求前缀和数组,再通过前缀和数组来求解子数组,然而,在这种情况下,当我们求解子数组时,仍然需要后遍历,求得从i到j位置的元素之和,再判断其是否符合条件,其时间复杂度仍是O(在通过前缀和数组求解子数组时,我们可以考虑向前遍历,即。原创 2024-01-08 09:00:00 · 1333 阅读 · 16 评论 -
最小覆盖子串(Java详解)
来解决本题,即使用left 和 right 两个指针维护一个窗口,窗口中不包含 t 中所有字符时,right向右滑动,添加新的字符,当窗口中包含 t 中所有字符时,判断并更新最小子串,再将left 向右滑动,移除左边元素。每次记录子串的长度,并更新记录的最短子串,当i 遍历完 s 时,找到最小子串,由于当 i 找到 t 中字符时,要使用 j 向后遍历,找到子串,因此,暴力枚举的时间复杂度为O(此时,虽然A为t中字符,但窗口中A的个数大于 t 中A的个数,此时的字符A不能判断为有效字符。原创 2023-12-27 09:00:00 · 1886 阅读 · 21 评论 -
长度最小的子数组(Java详解)
滑动窗口是一种基于。原创 2023-12-03 22:15:08 · 1170 阅读 · 32 评论 -
左孩子右兄弟(Java详解)
目录一、题目描述二、题解对于一棵多叉树,我们可以通过“左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。给定一棵包含N 个结点的多叉树,结点从1 至N 编号,其中1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过“左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。注:只有根结点这一个结点的树高度为0 。输入描述:输出描述:示例:输入:输出:思路分析原创 2023-11-24 20:51:39 · 682 阅读 · 31 评论 -
阿坤老师的独特瓷器(Java详解)
当我们将瓷器以d从大到小进行排序,则表明瓷器A前面的所有瓷器的直径d都大于或等于A的直径d,此时,我们只需要判断瓷器的高度h,假设瓷器A前面的所有瓷器直径d都大于A的d(等于的情况后面会讨论),则瓷器A前面。当d相同时,若将h更大的瓷器B排在A前面,则瓷器高度的最大值max必定大于A,A被判断为不是“独特瓷器”,然而,A的d与B的d相同,不满足B的d和h都大于A,因此,A是“独特瓷器”。瓷器的h大于A的h,则表明A不是“独特瓷器”,此时我们只需以。题目要求我们计算出“独特瓷器”的个数,而“独特瓷器”是指。原创 2023-11-19 22:48:23 · 458 阅读 · 21 评论 -
乘积尾零(Java详解)
若直接相乘最后求乘积的末尾有多少个零,由于相乘所得数据太大,会导致溢出,因此不能通过直接求所有数乘积的方法来求得尾零个数,那该如何求出尾零的个数呢?使用计数器count统计尾零的个数,遍历这100个数,每乘上一个数就统计其尾零的个数,计数器相加,并去除尾零,再将结果%10000,去除前面的位数。,我们使用计数器count加上结果末尾的零后,就可将尾部的零去除,用去除末尾零后的结果继续计算。但即使如此,因为相乘的100个数较大,每次去除零后再相乘,结果也很大,也可能会溢出,由于。,因此我们可以将结果。原创 2023-11-10 20:50:38 · 417 阅读 · 23 评论 -
前K个高频单词(Java详解)
给定一个单词列表words和一个整数k,返回前k个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,排序。"i" 和 "love" 为出现次数最多的两个单词,均为2次。注意,按字母顺序 "i" 在 "love" 之前。"the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,出现次数依次为 4, 3, 2 和 1 次。原创 2023-11-04 13:10:35 · 1090 阅读 · 32 评论 -
随机链表的复制(Java详解)
遍历原链表,根据原链表节点cur的next、random找到新链表节点node的next、random指向,并确定新链表的next、random。通过原链表节点找到新链表节点:map.get(cur),新链表节点的random:map.get(cur).random。通过原链表节点找到新链表节点:map.get(cur),新链表节点的next:map.get(cur).next。根据原链表节点的值创建新链表,并把原链表的节点和创建的新链表节点放入哈希表。通过原链表的头节点,找到新链表的头节点,并返回。原创 2023-10-30 21:45:07 · 368 阅读 · 37 评论 -
Java另一棵树的子树
(2)若两棵二叉树都不为空,再判断其根节点的值是否相同,若不相同,两棵二叉树不相同;若不相同,则判断root的左子树是否与subRoot是否相同,若相同,则subRoot是root的子树;若不同,判断root的右子树是否与subRoot相同,若相同,subRoot是root的子树;我们首先判断两棵二叉树是否相同,若相同,则subRoot是root的子树;(1)若subRoot为空,则subRoot为root的子树,返回true。(2)若root为空,则subRoot不为root的子树。原创 2023-10-09 11:43:26 · 614 阅读 · 36 评论 -
Java栈的压入、弹出序列(详解)
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。4.遍历完pushV数组后,判断p的大小,若p为0,则表示所有元素都已出栈,出栈序列为正确的出栈顺序,返回true,否则,返回false。2.使用i、j来遍历pushV、popV数组,pushV[p](栈顶元素)不等于当前出栈数组中元素,入栈:pushV[p](栈顶元素)不等于当前出栈数组中元素,p++(入栈)3.栈顶元素等于popV数组当前元素时,出栈。原创 2023-10-02 11:31:46 · 343 阅读 · 15 评论 -
Java括号匹配
若栈中无元素可以弹出,则无能与该右括号匹配的左括号,返回false,若栈为空,则表示所有的左括号都与相同类型的右括号匹配,返回true。若栈不为空,则表明还有未匹配的左括号,返回false,,就将栈顶元素弹出,判断是否是与其匹配的左括号,若是与其匹配的左括号,则继续遍历下一个字符。若不是与其匹配的左括号,返回false,,判断字符串是否有效。输入:s = "()"输入:s = "(]"原创 2023-09-27 21:20:19 · 556 阅读 · 29 评论 -
Java环形链表(图文详解)
fast一次走两步,slow一次走一步,若链表有环,fast一定能在环中追上slow。当fast一次走四步,slow一次走一步时,分析思路与fast一次走三步一致,fast可能反超slow一步或两步,此时fast与slow的距离变为C-1 或 C-2,然后继续分情况分析。当N为奇数时,fast走了(N-1)/ 2次之后,此时fast与slow的距离为1,由于fast走三步,slow走一步。当fast走三步,slow走两步 或是 fast一次走四步,slow一次走三步,fast与slow的速度差都为1,原创 2023-09-25 20:20:09 · 1308 阅读 · 26 评论 -
Java移除链表元素
由于链表为单链表,因此需要保存值为val节点node的上一个节点,可以创建prev和cur,cur指向当前节点,prev指向当前节点的上一节点,也可以通过cur.next.val找到值为val的节点。利用cur遍历原来链表,tail遍历新的链表,若cur的值不为val,则将cur赋值给tail,cur向后移动,若cur的值为val,则跳过该节点。要想删除链表中的元素,首先要找到值为val的节点node,将node的上一节点指向node的下一节点,即可删除值为val的节点,输出:[1,2,3,4,5]原创 2023-09-20 22:13:41 · 483 阅读 · 19 评论 -
Java不用加减乘除做加法(图文详解)
实现不考虑进位的相加,即 1 + 1 = 0,0 + 0 = 0,1 + 0 = 1,此时1111 + 1001 = 0110。当出现1 + 1时,产生进位,我们可以通过两个数按位与找到这些存在进位的数,再将其向左移动1位,实现进位。2.找出进位的数 5 + 6 = 11,存在进位,进位是100,9 + 7 = 16存在进位,进位是10。二进制满2进位,即1 + 1 = 10,此时不考虑进位,因此,可以通过。百位:1 + 1 = 2,十位:5 + 6 = 1,个位:9 + 7 = 6,即216。原创 2023-08-24 10:49:18 · 319 阅读 · 11 评论 -
Java寻找奇数
现在有一个长度为 n 的正整数序列,其中只有一种数值出现了奇数次,其他数值均出现偶数次,请你找出那个出现奇数次的数值。第一行:一个整数n,表示序列的长度。第二行:n个正整数ai,两个数中间以空格隔开。一个数,即在序列中唯一出现奇数次的数值。输入:52 1 2 3 1输出:3。原创 2023-08-23 14:03:00 · 769 阅读 · 11 评论 -
Java寻找数组的中心下标
中心下标左侧之和为 sum1 = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11。中心下标右侧之和为 sum2 = nums[4] + nums[5] = 5 + 6 = 11。输入:nums = [1, 7, 3, 6, 5, 6]通过题目描述和给出的示例,我们可以发现中心下标左侧数之和。如果中心下标位于数组最左端,那么左侧数之和视为。给你一个整数数组 nums ,请计算数组的。如果数组不存在中心下标,返回。时,i即为数组的中心下标。是数组的一个下标,其。原创 2023-08-19 10:34:02 · 1159 阅读 · 22 评论 -
Java旋转数组中的最小数字(图文详解版)
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。数组原本是一个升序数组,旋转之后,数组被分成两部分,前、后半部分分别为升序,后半部分小于前半部分,我们可以利用二分查找的思想,找到其旋转点,即可找到数组的最小值。使用Arrays.sort方法对数组进行降序排序,则nums[0]即为数组的最小值。原创 2023-08-12 10:53:52 · 1640 阅读 · 23 评论 -
尼科彻斯定理
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。例如:1^3=12^3=3+53^3=7+9+11输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。输入一个int整数输出分解后的string示例输入:6输出:31+33+35+37+39+41。原创 2023-08-11 09:39:14 · 202 阅读 · 1 评论 -
计算日期到天数的换算
根据输入的日期,计算是这一年的第几天。输入一行,每行空格分割,分别是年,月,日输出描述输出是这一年的第几天输入:1982 3 4输出:63。原创 2023-08-10 09:03:11 · 273 阅读 · 6 评论 -
打印1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。1. 用返回一个整数列表来代替打印2. n 为正整数,0 < n <= 5示例:输入:1返回值:[1, 2, 3, 4, 5, 6, 7, 8, 9]原创 2023-08-09 16:25:50 · 384 阅读 · 12 评论