2023年8月刷题记录
2023年8月1日
【leetcode】206. 反转链表
题意:
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
2023年8月2日
【leetcode】822. 翻转卡片游戏
题意:
在桌子上有
n
张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。我们可以先翻转任意张卡片,然后选择其中一张卡片。
如果选中的那张卡片背面的数字
x
与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。哪个数是这些想要的数字中最小的数(找到这些数中的最小值)呢?如果没有一个数字符合要求的,输出
0
。其中,
fronts[i]
和backs[i]
分别代表第i
张卡片的正面和背面的数字。如果我们通过翻转卡片来交换正面与背面上的数,那么当初在正面的数就变成背面的数,背面的数就变成正面的数。
2023年8月3日
【leetcode】722. 删除注释
题意:
给一个 C++ 程序,删除程序中的注释。这个程序
source
是一个数组,其中source[i]
表示第i
行源码。 这表示每行源码由'\n'
分隔。在 C++ 中有两种注释风格,行内注释和块注释。
- 字符串
//
表示行注释,表示//
和其右侧的其余字符应该被忽略。- 字符串
/*
表示一个块注释,它表示直到下一个(非重叠)出现的*/
之间的所有字符都应该被忽略。(阅读顺序为从左到右)非重叠是指,字符串/*/
并没有结束块注释,因为注释的结尾与开头相重叠。第一个有效注释优先于其他注释。
- 如果字符串
//
出现在块注释中会被忽略。- 同样,如果字符串
/*
出现在行或块注释中也会被忽略。如果一行在删除注释之后变为空字符串,那么不要输出该行。即,答案列表中的每个字符串都是非空的。
样例中没有控制字符,单引号或双引号字符。
- 比如,
source = "string s = "/* Not a comment. */";"
不会出现在测试样例里。此外,没有其他内容(如定义或宏)会干扰注释。
我们保证每一个块注释最终都会被闭合, 所以在行或块注释之外的
/*
总是开始新的注释。最后,隐式换行符可以通过块注释删除。 有关详细信息,请参阅下面的示例。
从源代码中删除注释后,需要以相同的格式返回源代码。
2023年8月4日
【leetcode】剑指 Offer 05. 替换空格
题意:
请实现一个函数,把字符串
s
中的每个空格替换成"%20"。
2023年8月5日
【leetcode】21. 合并两个有序链表
题意:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
2023年8月6日
【leetcode】24. 两两交换链表中的节点
题意:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2023年8月7日
【leetcode】344. 反转字符串
题意:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
s
的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
2023年8月8日
【leetcode】1749. 任意子数组和的绝对值的最大值
题意:
给你一个整数数组
nums
。一个子数组[numsl, numsl+1, ..., numsr-1, numsr]
的 和的绝对值 为abs(numsl + numsl+1 + ... + numsr-1 + numsr)
。请你找出
nums
中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。
abs(x)
定义如下:
- 如果
x
是负整数,那么abs(x) = -x
。- 如果
x
是非负整数,那么abs(x) = x
。
2023年8月9日
【leetcode】1281. 整数的各位积和之差
题意:
给你一个整数
n
,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
2023年8月10日
【leetcode】162. 寻找峰值
题意:
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组
nums
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设
nums[-1] = nums[n] = -∞
。你必须实现时间复杂度为
O(log n)
的算法来解决此问题。
2023年8月11日
【leetcode】1572. 矩阵对角线元素的和
题意:
给你一个正方形矩阵
mat
,请你返回矩阵对角线元素的和。请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。
2023年8月12日
【leetcode】23. 合并 K 个升序链表
题意:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
2023年8月13日
【leetcode】88. 合并两个有序数组
题意:
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。
2023年8月14日
【leetcode】617. 合并二叉树
题意:
给你两棵二叉树:
root1
和root2
。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
2023年8月15日
【leetcode】833. 字符串中的查找与替换
题意:
你会得到一个字符串
s
(索引从 0 开始),你必须对它执行k
个替换操作。替换操作以三个长度均为k
的并行数组给出:indices
,sources
,targets
。要完成第
i
个替换操作:
- 检查 子字符串
sources[i]
是否出现在 原字符串s
的索引indices[i]
处。- 如果没有出现, 什么也不做 。
- 如果出现,则用
targets[i]
替换 该子字符串。例如,如果
s = "abcd"
,indices[i] = 0
,sources[i] = "ab"
,targets[i] = "eee"
,那么替换的结果将是"eeecd"
。所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间不会重叠 。
- 例如,一个
s = "abc"
,indices = [0,1]
,sources = ["ab","bc"]
的测试用例将不会生成,因为"ab"
和"bc"
替换重叠。在对
s
执行所有替换操作后返回 结果字符串 。子字符串 是字符串中连续的字符序列。
2023年8月16日
【leetcode】2682. 找出转圈游戏输家
题意:
n
个朋友在玩游戏。这些朋友坐成一个圈,按 顺时针方向 从1
到n
编号。从第i
个朋友的位置开始顺时针移动1
步会到达第(i + 1)
个朋友的位置(1 <= i < n
),而从第n
个朋友的位置开始顺时针移动1
步会回到第1
个朋友的位置。游戏规则如下:
第
1
个朋友接球。
- 接着,第
1
个朋友将球传给距离他顺时针方向k
步的朋友。- 然后,接球的朋友应该把球传给距离他顺时针方向
2 * k
步的朋友。- 接着,接球的朋友应该把球传给距离他顺时针方向
3 * k
步的朋友,以此类推。换句话说,在第
i
轮中持有球的那位朋友需要将球传递给距离他顺时针方向i * k
步的朋友。当某个朋友第 2 次接到球时,游戏结束。
在整场游戏中没有接到过球的朋友是 输家 。
给你参与游戏的朋友数量
n
和一个整数k
,请按升序排列返回包含所有输家编号的数组answer
作为答案。
2023年8月17日
【leetcode】34. 在排序数组中查找元素的第一个和最后一个位置
题意:
给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。
2023年8月18日
【leetcode】367. 有效的完全平方数
题意:
给你一个正整数
num
。如果num
是一个完全平方数,则返回true
,否则返回false
。完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如
sqrt
。
2023年8月19日
【leetcode】2235. 两整数相加
题意:
给你两个整数
num1
和num2
,返回这两个整数的和。
2023年8月20日
【leetcode】2236. 判断根结点是否等于子结点之和
题意:
给你一个 二叉树 的根结点
root
,该二叉树由恰好3
个结点组成:根结点、左子结点和右子结点。如果根结点值等于两个子结点值之和,返回
true
,否则返回false
。
2023年8月21日
【leetcode】2337. 移动片段得到字符串
题意:
给你两个字符串
start
和target
,长度均为n
。每个字符串 仅 由字符'L'
、'R'
和'_'
组成,其中:
- 字符
'L'
和'R'
表示片段,其中片段'L'
只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段'R'
只有在其右侧直接存在一个 空位 时才能向 右 移动。- 字符
'_'
表示可以被 任意'L'
或'R'
片段占据的空位。如果在移动字符串
start
中的片段任意次之后可以得到字符串target
,返回true
;否则,返回false
。
2023年8月22日
【leetcode】849. 到最近的人的最大距离
题意:
给你一个数组
seats
表示一排座位,其中seats[i] = 1
代表有人坐在第i
个座位上,seats[i] = 0
代表座位i
上是空的(下标从 0 开始)。至少有一个空座位,且至少有一人已经坐在座位上。
亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。
返回他到离他最近的人的最大距离。
2023年8月23日
【leetcode】283. 移动零
题意:
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
2023年8月24日
【leetcode】1267. 统计参与通信的服务器
题意:
这里有一幅服务器分布图,服务器的位置标识在
m * n
的整数矩阵网格grid
中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。
请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。
2023年8月25日
【leetcode】1448. 统计二叉树中好节点的数目
题意:
给你一棵根为
root
的二叉树,请你返回二叉树中好节点的数目。「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。
2023年8月26日
【leetcode】228. 汇总区间
题意:
给定一个 无重复元素 的 有序 整数数组
nums
。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,
nums
的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于nums
的数字x
。列表中的每个区间范围
[a,b]
应该按如下格式输出:
"a->b"
,如果a != b
"a"
,如果a == b
2023年8月27日
【leetcode】56. 合并区间
题意:
以数组
intervals
表示若干个区间的集合,其中单个区间为intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
2023年8月28日
【leetcode】57. 插入区间
题意:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
2023年8月29日
【leetcode】823. 带因子的二叉树
题意:
给出一个含有不重复整数元素的数组
arr
,每个整数arr[i]
均大于 1。用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。
满足条件的二叉树一共有多少个?答案可能很大,返回 对
109 + 7
取余 的结果。
2023年8月30日
【leetcode】1654. 到家的最少跳跃次数
题意:
有一只跳蚤的家在数轴上的位置
x
处。请你帮助它从位置0
出发,到达它的家。跳蚤跳跃的规则如下:
- 它可以 往前 跳恰好
a
个位置(即往右跳)。- 它可以 往后 跳恰好
b
个位置(即往左跳)。- 它不能 连续 往后跳
2
次。- 它不能跳到任何
forbidden
数组中的位置。跳蚤可以往前跳 超过 它的家的位置,但是它 不能跳到负整数 的位置。
给你一个整数数组
forbidden
,其中forbidden[i]
是跳蚤不能跳到的位置,同时给你整数a
,b
和x
,请你返回跳蚤到家的最少跳跃次数。如果没有恰好到达x
的可行方案,请你返回-1
。
2023年8月31日
【leetcode】844. 比较含退格的字符串
题意:
给定
s
和t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true
。#
代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。