![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔试面试算法题练习集
一些常见的算法笔试题
真的不吃番茄
这个作者很懒,什么都没留下…
展开
-
2024年美团春招第一场笔试(技术)
先把事件存起来,然后把是朋友关系的且没有被淡忘的关系并查集加边,然后从最后一个事件逆序往上做,这里要注意的一点::::要考虑重边!解法:先把非0的数累加起来,然后接着想,怎样能让和最小和最大,很明显嘛,区间【L,R】是升序的,那么让那些未知数全部取L,自然加起来就是最小的,全部取R,自然就是最大的,纯纯送分题没啥好说的。小美认为,在人际交往中,但是随着时间的流逝,朋友的关系也是会慢慢变淡的,最终朋友关系就淡忘了。解法:乘积末尾至少要有k个0,那么剩余区间里的数2的因子和5的因子均不能少于k个,原创 2024-03-18 01:01:54 · 2267 阅读 · 3 评论 -
力扣热题100 下一个排列
就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。就是将其所有成员以序列或线性顺序排列。修改,只允许使用额外常数空间。原创 2024-03-01 03:30:06 · 484 阅读 · 1 评论 -
力扣热题100 环形链表II
解法:找环的入口,用快慢指针来做,快指针fast每次走两步,slow指针每次走一步。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。原创 2024-02-23 14:40:37 · 339 阅读 · 0 评论 -
力扣热题100 K个一组翻转链表
是一个正整数,它的值小于或等于链表的长度。解:反转链表进阶版,这是每k个反转一次,需要记录反转后的连接。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。的整数倍,那么请将最后剩余的节点保持原有顺序。个节点一组进行翻转,请你返回修改后的链表。原创 2024-02-23 14:33:36 · 428 阅读 · 0 评论 -
力扣热题100 随机链表的复制
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。解法:用哈希表记录每一个旧结点对应的新结点,然后连接next和random即可。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。那么在复制链表中对应的两个节点。例如,如果原链表中有。返回复制链表的头节点。原创 2024-02-23 14:31:58 · 338 阅读 · 0 评论 -
力扣刷题 翻转二叉树
解法:一层一层的交换,然后继续递归交换就可以了。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。原创 2024-02-12 23:49:57 · 373 阅读 · 0 评论 -
力扣刷题<简单> 二叉树的前序遍历
解法二:利用栈进行迭代(右结点先入栈,以便下一次操作的是左结点)原创 2024-02-12 22:24:53 · 375 阅读 · 0 评论 -
力扣热题100 合并区间
解法:按左端点排序,然后判断当前区间的右端点 有没有比下一个区间的左端点大,如果有,则可以合并,并且判断要不要更新右端点,如果没有,说明要开启新区间了。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。原创 2024-01-24 18:26:34 · 342 阅读 · 0 评论 -
力扣热题100 滑动窗口最大值
解法:单调队列经典题目,保持一个单调递增或者单调递减的队列,让队头永远是当前窗口的最大值或者最小值,那么有这样的性质,后面遍历的元素,只有比窗口的所有元素小,才能入队,否则将窗口里所有比他小的出队,才能保证队头永远是当前窗口的最大值或者最小值。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口每次只向右移动一位。原创 2024-01-22 15:11:44 · 457 阅读 · 0 评论 -
力扣热题100 合并K个有序链表
请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。解法:归并排序或者顺序合并或者堆排序都可以。原创 2024-01-22 14:48:10 · 375 阅读 · 0 评论 -
力扣题目 删除字符串中的所有相邻重复项
解法:本题其实只是考察普通栈的应用,如果你能够想到用栈,那么这道题将会是非常简单的题目。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。会选择两个相邻且相同的字母,并删除它们。给出由小写字母组成的字符串。原创 2024-01-22 14:39:59 · 363 阅读 · 0 评论 -
力扣热题100 排序链表
【代码】力扣热题100 排序链表。原创 2024-01-21 14:52:20 · 409 阅读 · 0 评论 -
力扣热题100 缺失的第一个正数
解法:用数组的下标模拟 哈希表的键值,出现过的数字,则把和数字一下的下标对应的值标记成负数,最后枚举一下数组,哪个不是负数,就说明没出现过,全部为负数,则答案是N+1.,请你找出其中没有出现的最小的正整数。并且只使用常数级别额外空间的解决方案。给你一个未排序的整数数组。请你实现时间复杂度为。原创 2024-01-21 16:05:31 · 387 阅读 · 0 评论 -
蓝桥杯真题 二分真题 技能升级
解法:由于每次挑的数都是单调递减的,所以可以用二分枚举第m个数的可能值x,再判断所有技能中,每次的新增攻击力 大于等于x的个数有没有大于等于m个,由于每个技能都是一个等差数列,可以通过公式用O(1)的时间算出,大于等于x的数有几个,把所有技能中大于等于x的个数累加,如果大于等于m个,则可以抛弃比x小的区间(如果x变得更小,大于x的数会变的更多,不合理,故抛弃),如果小于m个,说明我们取的x太大了,需要变小,则抛弃大于等于x的区间。现在小蓝可以总计升级 M次技能,他可以任意选择升级的技能和次数。原创 2024-01-20 15:41:08 · 1042 阅读 · 0 评论 -
力扣热题100 环形链表II
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。原创 2024-01-20 13:57:33 · 327 阅读 · 0 评论 -
力扣热题100 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。原创 2024-01-20 13:56:09 · 344 阅读 · 0 评论 -
力扣热题100 相交链表
请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。原创 2024-01-20 13:34:41 · 346 阅读 · 0 评论 -
二分应用题 [蓝桥杯2017初赛] 分巧克力
由于枚举边长具有二段性,所以这里枚举边长我们用二分来做,把时间复杂度从O(n)降到了O(logn),判断能否构成的时间复杂度是O(n),整体时间复杂度降到O(nlogn)解法:从边长1开始枚举到最大边长,判断能不能切出 k块 边长=当前枚举边长的巧克力。如果直接暴力枚举边长,时间复杂度是O(n^2),这是N有100000,是会超时的。例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。1. 形状是正方形,边长是整数。原创 2024-01-19 14:10:50 · 488 阅读 · 0 评论 -
二分应用题 [蓝桥杯2022年省赛真题] 求阶乘
解法:要满足尾数有0,则这个阶乘中一定包含10的因子,而10由2和5组成,所以其实就是判断以下有多少个2*5的因子,由于2的数量一定是比5大的,所以我们只需要计算一下N这个数字的阶乘里有多少个5这个因子,就可以判断末尾有几个0!又因为,当N越大,出现的尾数0才可能越多,即尾数0的个数是随着N的增大而增大的,具有单调性,所以可以对N进行二分查找,降低时间复杂度。比如25,25/5=5, 有5个5,5/5=1, 所以25的阶乘里总共有6个5,也就有6个尾数0。的末尾恰好有K个0的最小的N是多少?原创 2024-01-19 13:36:40 · 448 阅读 · 0 评论 -
力扣热题100 234.回文链表
解法:利用栈先进先出的特点,存储每个结点的值,然后反向比对n/2个元素即可。,请你判断该链表是否为回文链表。给你一个单链表的头节点。原创 2024-01-14 16:37:02 · 415 阅读 · 0 评论 -
力扣100题 94.二叉树的中序遍历
给定一个二叉树的根节点。原创 2024-01-14 14:44:08 · 349 阅读 · 0 评论 -
力扣面试150题 删除排序链表中的重复元素
leetcode每日一题,简单题就不讲了,就模拟数据结构链表的操作。删除所有重复的元素,使每个元素只出现一次。给定一个已排序的链表的头。原创 2024-01-14 14:05:57 · 329 阅读 · 0 评论 -
力扣面试150题 整数转罗马数字
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做。解法:硬编码,记一下这题就好了把,应该不会考那么傻的题把。,即为两个并列的 1。给你一个整数,将其转为罗马数字。例如, 罗马数字 2 写做。原创 2024-01-13 19:09:43 · 346 阅读 · 0 评论 -
力扣面试150题 反转字符串中的单词
为了方便处理,先把首部和尾部多余的空格去掉,然后双指针操作,第一个指针i 找每个单词的首个字母,第二个指针j 找单词结尾后的第一个空格,然后把这段剪出来(不包含空格)放进数组保存就好了。全部解决完后,逆序打印。中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。解法:一道字符串的模拟题,稍微操作不当就会失误,还会附带法术头疼。中使用至少一个空格将字符串中的。之间用单个空格连接的结果字符串。是由非空格字符组成的字符串。原创 2024-01-13 18:52:15 · 352 阅读 · 0 评论 -
力扣面试150题 加油站
解法: 线性的枚举每个点,如果当前点能到达下一个点,则先以当前点为起点,看看能不能遍历完n个点后,油量仍然大于等于0,如果有,说明当前起点可以作为答案。否则,起点移动至 不能到达的那个点,因为,假设x点能到达y点,到达不了y+1点,则x到y中的任意一点都到不了y+1个点,故可以排除一些点。如果选中的点本身就不能到达下一个点,我们就继续找下一个点,能满足到达下一个点的点。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。你从其中的一个加油站出发,开始时油箱为空。个加油站需要消耗汽油。原创 2024-01-13 17:19:46 · 509 阅读 · 0 评论 -
力扣面试150题 除自身以外数组的乘积
解法:一道利用前缀乘和后缀乘思想的题目,先预处理出每个数 左边数的乘积和右边数的乘积,然后遍历每个数,把每个数左边的乘积和右边的乘积相乘即可。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。原创 2024-01-12 23:42:39 · 555 阅读 · 0 评论 -
力扣面试150题 H指数
解法: 一道适合用来练习二分的题目,答案h具有二段性,二分枚举h,并判断是否合法即可。篇论文被引用的次数。计算并返回该研究者的 h。代表“高引用次数” ,一名科研人员的。篇论文被引用次数大于等于。是指他(她)至少发表了。原创 2024-01-12 18:09:35 · 369 阅读 · 0 评论 -
力扣面试150题 跳跃游戏II
由于是一定存在答案的,也就是说,不考虑最后一个点的情况,前面的点能跳的最远的距离一定是大于等于n,所以为了避免冗余,我们不枚举最后一个点。因为这里的可能起点是 上一次起点+1 到ed 这段区间中的其中一个点,但是不变的是,不管选择哪个点,都是要跳一次。然后再把 更远的地方 赋值给ed,新起点能跳的更远的地方。当i枚举到ed时,说明此时要跳了,这里不需要在意是由哪个点开始跳的,用ed 记录 每次的起点能跳的最远的地方。向前跳转的最大长度。生成的测试用例可以到达。思路:贪心,不断更新能跳的更远的地方。原创 2024-01-12 17:50:59 · 486 阅读 · 0 评论 -
力扣每日一题 2625.构造有效字符串的最少插入数
分类讨论,判断当前字符和下一个字符能否构成"ab","bc","ac"中的其中一个,如果可以的话,当前就只需要添加一个字符,并且指针继续向后移动两位继续遍历。注意:对每个子串末尾添加一个任意字符(不要是abc就行),因为有可能子串的最后一个字符是单独一组的,当左指针在最后一位时,右指针越界了,无法进行判断。解法:双指针做法,有连续的abc是不需要增添的,那么可以把字符串把"abc"当作分隔符分隔出若干个子串,对每个子串求插入字母数。,你可以向其中任何位置插入 "a"、"b" 或 "c" 任意次,返回使。原创 2024-01-11 17:50:57 · 686 阅读 · 0 评论 -
蓝桥杯真题 整数删除
解法:首先根据题意,可以分析出,要找到前k个最小的数,但是由于数组每个数的值是动态的,有可能发生变化,比如删除一个数,旁边两个都要加上这个删除的数,找到前k个最小的数,我们可以用优先队列维护,时间复杂度是nlogn,而删除一个数,如果用数组做,时间复杂度是O(n),加上优先队列会超时,所以这里用双向链表,记住每个数左边数的下标和右边的下标,这样删除一个数的时间复杂度可以降到O(1)。原创 2024-01-07 16:33:13 · 567 阅读 · 0 评论 -
蓝桥杯真题 子串简写
解法:双指针或者二分,最主要的是能想到,先把出现c1字符和c2字符的下标先存起来,然后枚举c1出现的每个坐标,用双指针或者二分去找到c2中第一个符合条件的下标,因为下标存储是递增的,当前的下标符合了,后面的肯定也就符合了,就可以总数-第一个符合条件的下标。原创 2024-01-07 01:45:55 · 743 阅读 · 0 评论 -
蓝桥杯真题 接龙序列
对于一个数字,首位是a,尾部是b的数字,f[b]=max(f[b],f[a]+1);最后找到最大的f[i],就是这个序列的最长接龙序列了, n-max 就是答案了。解法:是一道线性dp题,。可惜比赛的时候没想出来,还是做题太少了。定义f[i],表示以i数字结尾的最长接龙序列。原创 2024-01-07 00:57:16 · 365 阅读 · 0 评论 -
蓝桥杯真题 冶炼金属
如果 mid不符合,答案至少是能舍弃一半的,要么正确答案在mid左边,或者右边,时间复杂度为O(logn)再判断当前的mid 是否符合题意,判断的时间复杂度是O(n),故总体时间复杂度O(nlogn)。遇到需要时间复杂度在nlogn下完成的,又是求最小值最大值问题,可以考虑使用二分。解法:有一些数学大佬很快就研究出了对应的数学公式,在O(1)的情况下算出答案。求解最小值最大值问题,可以考虑使用二分,因为答案具有二段性,比如求最小值。这里主要用二分的思想来解题。原创 2024-01-06 02:43:59 · 419 阅读 · 0 评论 -
蓝桥杯题目 岛屿个数
那么只需要用bfs 每找出一块岛屿,就判断一下这块岛屿能不能通过海水延伸到边界以外,如果可以,此时答案+1。为了方便处理,我们可以在外围加上一圈海水。然后,每次判断一个岛屿能不能跑到边界,需要初始化标记数组,避免和之前的岛屿判断产生冲突。解法:可以发现,子岛屿会被父岛屿包围起来,导致子岛屿是不能借助海水延伸到边界的。这里要注意两个点,通过海水延伸是可以8个方向的,也是一个踩坑点。而父岛屿,是能借助海水或者本身就在边界处了。原创 2024-01-06 02:39:40 · 819 阅读 · 0 评论 -
力扣面试150题 买卖股票的最佳时机IV
由上一篇文章其实可以发现,数组下标奇数是买,偶数是卖,那么我们写个内层循环就好啦。解法:其实和上一篇文章 买卖股票III差不多,这里由买卖最多2次变成了k次。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。设计一个算法来计算你所能获取的最大利润。也就是说,你最多可以买。是某支给定的股票在第。记得要初始化dp数组哦。原创 2024-01-05 19:36:58 · 476 阅读 · 0 评论 -
力扣面试150题 买卖股票的最佳时机III
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。设计一个算法来计算你所能获取的最大利润。原创 2024-01-05 19:14:16 · 373 阅读 · 0 评论 -
力扣面试150题 买卖股票的最佳时机II (动态规划版)
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i[) // 前一天压根没买股票的最大利润 和 前一天是有股票的最大利润 +把他卖掉后的利润。dp[i][1] = max(dp[i-1][1],dp[i-1][0]- prices[j[) //前一天就已经有股票在身上了,和前一天没股票在身上的最大利润 减掉 今天买股票的钱。解法:定义dp[i][0] 表示在第i天 不持有股票的最大利润, dp[i][1]表示在第i天持有股票的最大利润。你也可以先购买,然后在。原创 2024-01-05 18:37:09 · 335 阅读 · 0 评论 -
力扣面试150题 编辑距离
当word1 [i-1] == word2 [j-1], 此时不需要做任何操作,那么dp[i][j] = dp[i-1][j-1]2.增加 由于word1 增加一个字符可以逆向为 word2删除一个字符,那么dp[i][j] =dp[i][j-1] +1。3.修改, 只需要把第i-1个字符直接修改即可,所以 dp[i][j] == dp[i-1][j-1]+1。1.删除 将word1[i-1]删除,那么此时的dp[i][j] = dp[i-1] [ j] +1。当word1 [i-1]!原创 2024-01-05 18:12:08 · 461 阅读 · 0 评论 -
力扣面试150题 二叉树的锯齿形层序遍历
解法:bfs,对于奇数层要放下一层的结点,正常从左到右遍历后,逆序一下即可,对于偶数层要放下一层结点,由于偶数层本身就是从当前层最后一个结点开始遍历的,然后要先放右结点再放左结点,再逆序,才能使得下一层(奇数层)是从左到右遍历的。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。原创 2024-01-04 19:34:03 · 329 阅读 · 0 评论 -
力扣 找出出现至少三次的最长特殊子字符串II
定义左指针j,右指针i, (j到i-1)是一段字符连续相等的字符串,根据字符串长度我们可以计算出每种字符串 如“aaaa”中 “a”,"aa","aaa","aaaa"出现的次数,记录一个出现次数大于3且长度最大的即可。时间复杂度大概在O(n)~O(nlogn)区间,难在内存消耗比较大,需要26*O(S.size())的长度,如果不存在出现至少三次的特殊子字符串,则返回。如果一个字符串仅由单一字符组成,那么它被称为。给你一个仅由小写英文字母组成的字符串。不是特殊字符串,而字符串。是字符串中的一个连续。原创 2024-01-04 19:46:09 · 697 阅读 · 0 评论