2023年4月刷题记录
Posted JiaMian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023年4月刷题记录相关的知识,希望对你有一定的参考价值。
2023年4月1日
leetcode831. 隐藏个人信息
链接地址:https://leetcode.cn/problems/masking-personal-information/
题意:
给你一条个人信息字符串
s
,可能表示一个 邮箱地址 ,也可能表示一串 电话号码 。返回按如下规则 隐藏 个人信息后的结果:电子邮件地址:
一个电子邮件地址由以下部分组成:
- 一个 名字 ,由大小写英文字母组成,后面跟着
- 一个
\'@\'
字符,后面跟着- 一个 域名 ,由大小写英文字母和一个位于中间的
\'.\'
字符组成。\'.\'
不会是域名的第一个或者最后一个字符。要想隐藏电子邮件地址中的个人信息:
- 名字 和 域名 部分的大写英文字母应当转换成小写英文字母。
- 名字 中间的字母(即,除第一个和最后一个字母外)必须用 5 个
"*****"
替换。电话号码:
一个电话号码应当按下述格式组成:
- 电话号码可以由 10-13 位数字组成
- 后 10 位构成 本地号码
- 前面剩下的 0-3 位,构成 国家代码
- 利用
\'+\', \'-\', \'(\', \')\', \' \'
这些 分隔字符 按某种形式对上述数字进行分隔要想隐藏电话号码中的个人信息:
- 移除所有 分隔字符
- 隐藏个人信息后的电话号码应该遵从这种格式:
"***-***-XXXX"
如果国家代码为 0 位数字"+*-***-***-XXXX"
如果国家代码为 1 位数字"+**-***-***-XXXX"
如果国家代码为 2 位数字"+***-***-***-XXXX"
如果国家代码为 3 位数字"XXXX"
是最后 4 位 本地号码
2023年4月2日
leetcode1039. 多边形三角剖分的最低得分
链接地址:https://leetcode.cn/problems/minimum-score-triangulation-of-polygon/
题意:
你有一个凸的
n
边形,其每个顶点都有一个整数值。给定一个整数数组values
,其中values[i]
是第i
个顶点的值(即 顺时针顺序 )。假设将多边形 剖分 为
n - 2
个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有n - 2
个三角形的值之和。返回 多边形进行三角剖分后可以得到的最低分 。
2023年4月3日
leetcode1053. 交换一次的先前排列
链接地址:https://leetcode.cn/problems/previous-permutation-with-one-swap/
题意:
给你一个正整数数组
arr
(可能存在重复的元素),请你返回可在 一次交换(交换两数字arr[i]
和arr[j]
的位置)后得到的、按字典序排列小于arr
的最大排列。如果无法这么操作,就请返回原数组。
2023年4月4日
leetcode322. 零钱兑换
链接地址:https://leetcode.cn/problems/coin-change/
题意:
给你一个整数数组
coins
,表示不同面额的硬币;以及一个整数amount
,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回
-1
。你可以认为每种硬币的数量是无限的。
2023年4月5日
leetcode2427. 公因子的数目
链接地址:https://leetcode.cn/problems/number-of-common-factors/
题意:
给你两个正整数
a
和b
,返回a
和b
的 公 因子的数目。如果
x
可以同时整除a
和b
,则认为x
是a
和b
的一个 公因子 。
2023年4月6日
leetcode1017. 负二进制转换
链接地址:https://leetcode.cn/problems/convert-to-base-2/
题意:
给你一个整数
n
,以二进制字符串的形式返回该整数的 负二进制(base -2
)表示。注意,除非字符串就是
"0"
,否则返回的字符串中不能含有前导零。
2023年4月7日
leetcode875. 爱吃香蕉的珂珂
链接地址:https://leetcode.cn/problems/koko-eating-bananas/
题意:
珂珂喜欢吃香蕉。这里有
n
堆香蕉,第i
堆中有piles[i]
根香蕉。警卫已经离开了,将在h
小时后回来。珂珂可以决定她吃香蕉的速度
k
(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉k
根。如果这堆香蕉少于k
根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在
h
小时内吃掉所有香蕉的最小速度k
(k
为整数)。
2023年4月8日
leetcode1409. 查询带键的排列
链接地址:https://leetcode.cn/problems/queries-on-a-permutation-with-key/
题意:
给你一个待查数组
queries
,数组中的元素为1
到m
之间的正整数。 请你根据以下规则处理所有待查项queries[i]
(从i=0
到i=queries.length-1
):
- 一开始,排列
P=[1,2,3,...,m]
。- 对于当前的
i
,请你找出待查项queries[i]
在排列P
中的位置(下标从 0 开始),然后将其从原位置移动到排列P
的起始位置(即下标为 0 处)。注意,queries[i]
在P
中的位置就是queries[i]
的查询结果。请你以数组形式返回待查数组
queries
的查询结果。
2023年4月9日
leetcode2399. 检查相同字母间的距离
链接地址:https://leetcode.cn/problems/check-distances-between-same-letters/
题意:
给你一个下标从 0 开始的字符串
s
,该字符串仅由小写英文字母组成,s
中的每个字母都 恰好 出现 两次 。另给你一个下标从 0 开始、长度为26
的的整数数组distance
。字母表中的每个字母按从
0
到25
依次编号(即,\'a\' -> 0
,\'b\' -> 1
,\'c\' -> 2
, ... ,\'z\' -> 25
)。在一个 匀整 字符串中,第
i
个字母的两次出现之间的字母数量是distance[i]
。如果第i
个字母没有在s
中出现,那么distance[i]
可以 忽略 。如果
s
是一个 匀整 字符串,返回true
;否则,返回false
。
2023年4月10日
leetcode1019. 链表中的下一个更大节点
链接地址:https://leetcode.cn/problems/next-greater-node-in-linked-list/
题意:
给定一个长度为
n
的链表head
对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。
返回一个整数数组
answer
,其中answer[i]
是第i
个节点( 从1开始 )的下一个更大的节点的值。如果第i
个节点没有下一个更大的节点,设置answer[i] = 0
。
2023年4月11日
leetcode1041. 困于环中的机器人
链接地址:https://leetcode.cn/problems/robot-bounded-in-circle/
题意:
在无限的平面上,机器人最初位于
(0, 0)
处,面朝北方。注意:
- 北方向 是y轴的正方向。
- 南方向 是y轴的负方向。
- 东方向 是x轴的正方向。
- 西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
"G"
:直走 1 个单位"L"
:左转 90 度"R"
:右转 90 度机器人按顺序执行指令
instructions
,并一直重复它们。只有在平面中存在环使得机器人永远无法离开时,返回
true
。否则,返回false
。
2023年4月12日
leetcode1823. 找出游戏的获胜者
链接地址:https://leetcode.cn/problems/find-the-winner-of-the-circular-game/
题意:
共有
n
名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从1
到n
编号。确切地说,从第i
名小伙伴顺时针移动一位会到达第(i+1)
名小伙伴的位置,其中1 <= i < n
,从第n
名小伙伴顺时针移动一位会回到第1
名小伙伴的位置。游戏遵循如下规则:
- 从第
1
名小伙伴所在位置 开始 。- 沿着顺时针方向数
k
名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。- 你数到的最后一名小伙伴需要离开圈子,并视作输掉游戏。
- 如果圈子中仍然有不止一名小伙伴,从刚刚输掉的小伙伴的 顺时针下一位 小伙伴 开始,回到步骤
2
继续执行。- 否则,圈子中最后一名小伙伴赢得游戏。
给你参与游戏的小伙伴总数
n
,和一个整数k
,返回游戏的获胜者。
2023年4月13日
leetcode2404. 出现最频繁的偶数元素
链接地址:https://leetcode.cn/problems/most-frequent-even-element/
题意:
给你一个整数数组
nums
,返回出现最频繁的偶数元素。如果存在多个满足条件的元素,只需要返回 最小 的一个。如果不存在这样的元素,返回
-1
。
2023年4月14日
leetcode1023. 驼峰式匹配
链接地址:https://leetcode.cn/problems/camelcase-matching/
题意:
如果我们可以将小写字母插入模式串
pattern
得到待查询项query
,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)给定待查询列表
queries
,和模式串pattern
,返回由布尔值组成的答案列表answer
。只有在待查项queries[i]
与模式串pattern
匹配时,answer[i]
才为true
,否则为false
。
2023年4月15日
leetcode1042. 不邻接植花
链接地址:https://leetcode.cn/problems/flower-planting-with-no-adjacent/
题意:
有
n
个花园,按从1
到n
标记。另有数组paths
,其中paths[i] = [xi, yi]
描述了花园xi
到花园yi
的双向路径。在每个花园中,你打算种下四种花之一。另外,所有花园 最多 有 3 条路径可以进入或离开.
你需要为每个花园选择一种花,使得通过路径相连的任何两个花园中的花的种类互不相同。
以数组形式返回 任一 可行的方案作为答案
answer
,其中answer[i]
为在第(i+1)
个花园中种植的花的种类。花的种类用 1、2、3、4 表示。保证存在答案。
2023年4月16日
leetcode890. 查找和替换模式
链接地址:https://leetcode.cn/problems/find-and-replace-pattern/
题意:
你有一个单词列表
words
和一个模式pattern
,你想知道words
中的哪些单词与模式匹配。如果存在字母的排列
p
,使得将模式中的每个字母x
替换为p(x)
之后,我们就得到了所需的单词,那么单词与模式是匹配的。(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)
返回
words
中与给定模式匹配的单词列表。你可以按任何顺序返回答案。
2023年4月17日
leetcode2409. 统计共同度过的日子数
链接地址:https://leetcode.cn/problems/count-days-spent-together/
题意:
Alice 和 Bob 计划分别去罗马开会。
给你四个字符串
arriveAlice
,leaveAlice
,arriveBob
和leaveBob
。Alice 会在日期arriveAlice
到leaveAlice
之间在城市里(日期为闭区间),而 Bob 在日期arriveBob
到leaveBob
之间在城市里(日期为闭区间)。每个字符串都包含 5 个字符,格式为"MM-DD"
,对应着一个日期的月和日。请你返回 Alice和 Bob 同时在罗马的天数。
你可以假设所有日期都在 同一个 自然年,而且 不是 闰年。每个月份的天数分别为:
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
。
2023年4月18日
leetcode1026. 节点与其祖先之间的最大差值
链接地址:https://leetcode.cn/problems/maximum-difference-between-node-and-ancestor/
题意:
给定二叉树的根节点
root
,找出存在于 不同 节点A
和B
之间的最大值V
,其中V = |A.val - B.val|
,且A
是B
的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)
2023年4月19日
leetcode1043. 分隔数组以得到最大和
链接地址:https://leetcode.cn/problems/partition-array-for-maximum-sum/
题意:
给你一个整数数组
arr
,请你将该数组分隔为长度 最多 为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。返回将数组分隔变换后能够得到的元素最大和。本题所用到的测试用例会确保答案是一个 32 位整数。
2023年4月20日
leetcode1387. 将整数按权重排序
链接地址:https://leetcode.cn/problems/sort-integers-by-the-power-value/
题意:
我们将整数
x
的 权重 定义为按照下述规则将x
变成1
所需要的步数:
- 如果
x
是偶数,那么x = x / 2
- 如果
x
是奇数,那么x = 3 * x + 1
比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。
给你三个整数
lo
,hi
和k
。你的任务是将区间[lo, hi]
之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序 。请你返回区间
[lo, hi]
之间的整数按权重排序后的第k
个数。注意,题目保证对于任意整数
x
(lo <= x <= hi)
,它变成1
所需要的步数是一个 32 位有符号整数。
2023年4月21日
leetcode2413. 最小偶倍数
链接地址:https://leetcode.cn/problems/smallest-even-multiple/
题意:
给你一个正整数
n
,返回2
和n
的最小公倍数(正整数)。
2023年4月22日
leetcode1027. 最长等差数列
链接地址:https://leetcode.cn/problems/longest-arithmetic-subsequence/
题意:
给你一个整数数组
nums
,返回nums
中最长等差子序列的长度。回想一下,
nums
的子序列是一个列表nums[i1], nums[i2], ..., nums[ik]
,且0 <= i1 < i2 < ... < ik <= nums.length - 1
。并且如果seq[i+1] - seq[i]
(0 <= i < seq.length - 1
) 的值都相同,那么序列seq
是等差的。
2023年4月23日
leetcode1105. 填充书架
链接地址:https://leetcode.cn/problems/filling-bookcase-shelves/
题意:
给定一个数组
books
,其中books[i] = [thicknessi, heighti]
表示第i
本书的厚度和高度。你也会得到一个整数shelfWidth
。按顺序 将这些书摆放到总宽度为
shelfWidth
的书架上。先选几本书放在书架上(它们的厚度之和小于等于书架的宽度
shelfWidth
),然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。需要注意的是,在上述过程的每个步骤中,摆放书的顺序与你整理好的顺序相同。
- 例如,如果这里有 5 本书,那么可能的一种摆放情况是:第一和第二本书放在第一层书架上,第三本书放在第二层书架上,第四和第五本书放在最后一层书架上。
每一层所摆放的书的最大高度就是这一层书架的层高,书架整体的高度为各层高之和。
以这种方式布置书架,返回书架整体可能的最小高度。
2023年4月24日
leetcode119. 杨辉三角 II
链接地址:https://leetcode.cn/problems/pascals-triangle-ii/
题意:
给定一个非负索引
rowIndex
,返回「杨辉三角」的第rowIndex
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
2023年4月25日
leetcode2418. 按身高排序
链接地址:https://leetcode.cn/problems/sort-the-people/
题意:
给你一个字符串数组
names
,和一个由 互不相同 的正整数组成的数组heights
。两个数组的长度均为n
。对于每个下标
i
,names[i]
和heights[i]
表示第i
个人的名字和身高。请按身高 降序 顺序返回对应的名字数组
names
。
2023年4月26日
leetcode1031. 两个非重叠子数组的最大和
链接地址:https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays/
题意:
给你一个整数数组
nums
和两个整数firstLen
和secondLen
,请你找出并返回两个非重叠 子数组 中元素的最大和,长度分别为firstLen
和secondLen
。长度为
firstLen
的子数组可以出现在长为secondLen
的子数组之前或之后,但二者必须是不重叠的。子数组是数组的一个 连续 部分。
2023年4月27日
leetcode1048. 最长字符串链
链接地址:https://leetcode.cn/problems/longest-string-chain/
题意:
给出一个单词数组
words
,其中每个单词都由小写英文字母组成。如果我们可以 不改变其他字符的顺序 ,在
wordA
的任何地方添加 恰好一个 字母使其变成wordB
,那么我们认为wordA
是wordB
的 前身 。
- 例如,
"abc"
是"abac"
的 前身 ,而"cba"
不是"bcad"
的 前身词链是单词
[word_1, word_2, ..., word_k]
组成的序列,k >= 1
,其中word1
是word2
的前身,word2
是word3
的前身,依此类推。一个单词通常是k == 1
的 单词链 。从给定单词列表
words
中选择单词组成词链,返回 词链的 最长可能长度 。
2023年4月28日
leetcode136. 只出现一次的数字
链接地址:https://leetcode.cn/problems/single-number/
题意:
给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
2023年4月29日
leetcode2423. 删除字符使频率相同
链接地址:https://leetcode.cn/problems/remove-letter-to-equalize-frequency/
题意:
给你一个下标从 0 开始的字符串
word
,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得word
中剩余每个字母出现 频率 相同。如果删除一个字母后,
word
中剩余所有字母的出现频率都相同,那么返回true
,否则返回false
。注意:
- 字母
x
的 频率 是这个字母在字符串中出现的次数。- 你 必须 恰好删除一个字母,不能一个字母都不删除。
2023年4月30日
leetcode1033. 移动石子直到连续
链接地址:https://leetcode.cn/problems/moving-stones-until-consecutive/
题意:
三枚石子放置在数轴上,位置分别为
a
,b
,c
。每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这三枚石子当前分别位于位置
x, y, z
且x < y < z
。那么就可以从位置x
或者是位置z
拿起一枚石子,并将该石子移动到某一整数位置k
处,其中x < k < z
且k != y
。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。
要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:
answer = [minimum_moves, maximum_moves]
。
蓝桥杯3月刷题集训-A 枚举&模拟Day3
蓝桥杯3月刷题集训-A 【枚举&模拟】Day3
文章目录
一、扫雷
我们首先读取输入中的方格图,将其保存在一个二维数组 grid
中。然后,遍历方格图中的每一个方格,对于每个空白方格,遍历其周围八个方格,统计其中地雷的数量,输出结果;对于每个有地雷的方格,直接输出 9。在输出时,每一行输出结束后需要换行,以便下一行的输出。
# 读取输入,n 行 m 列的方格图
n, m = map(int, input().split())
grid = []
for i in range(n):
row = list(map(int, input().split()))
grid.append(row)
# 遍历方格图中的每一个方格
for i in range(n):
for j in range(m):
# 如果这个方格没有地雷,计算周围八个方格中的地雷数量并输出
if grid[i][j] == 0:
count = 0
# 遍历周围八个方格
for x in range(max(0, i-1), min(n, i+2)):
for y in range(max(0, j-1), min(m, j+2)):
if grid[x][y] == 1: # 如果这个方格有地雷,则计数器加 1
count += 1
print(count, end=' ') # 输出周围地雷数量
# 如果这个方格有地雷,直接输出 9
else:
print(9, end=' ')
print() # 每行结束后换行输出下一行
下面是我的朋友提供的另一种解题思路:首先定义一个二维列表来表示扫雷的方格图,将每个有地雷的位置标记为9,对于每个没有地雷的位置,遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量,最后输出整个方格图。
具体实现步骤如下:
- 读入 n, m 表示方格图的行数和列数。
- 定义一个列表 dir,其中包含八个方向的坐标偏移量,用于表示每个位置周围的八个位置。
- 定义一个空列表 s 用于存储方格图。
- 定义一个二维列表 vis,用于表示某个位置是否被访问过。
- 读入方格图,将其存入列表 s 中,并初始化 vis 为全 False。
- 遍历整个方格图,对于每个位置,如果它是有地雷的位置,则将其标记为9,否则遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量。
- 在遍历过程中,将该位置的 vis 标记为 True,表示已访问。
- 输出整个方格图。
n, m = map(int, input().split())
# 定义方向数组,包含 8 个方向,分别为上、左上、左、左下、下、右下、右、右上。数组中每个元素包含两个值,分别表示在行和列方向上的偏移量。
dir = [[-1,0],[-1,-1],[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1]]
# 定义一个空列表 s,用来存放方格图中每个格子的数字。
s = []
# 定义一个二维数组 vis,用来记录某个格子是否已经被访问过。
vis = [[False]*m for _ in range(n)]
# 定义一个函数 in_bound(x, y),用来判断坐标 (x, y) 是否越界。
def in_bound(x, y):
return x>=0 and y>=0 and x<n and y<m
# 输入方格图,将每一行作为一个列表,添加到 s 列表中。
for i in range(n):
row = list(map(int, input().split()))
s.append(row)
for i in range(n):
for j in range(m):
tmp = 0
# 遍历每一个格子,如果该格子是地雷,则将其标记为 9
if s[i][j] == 1:
s[i][j] = 9
# 如果该格子没有地雷,则统计其周围 8 个格子中地雷的个数,将该个数赋值给该格子。
elif s[i][j] == 0:
for k in range(8):
tx = i + dir[k][0] # 计算出该格子的下一个格子的坐标
ty = j + dir[k][1] # 计算出该格子的下一个格子的坐标
if in_bound(tx, ty) and ((s[tx][ty] == 1 and not vis[tx][ty]) or s[tx][ty] == 9): # 如果该格子的下一个格子是地雷,且没有被访问过,则将该格子的数字加 1
tmp += 1 # 如果该格子的下一个格子是地雷,且已经被访问过,则不做任何操作
s[i][j] = tmp # 将该格子的数字赋值给该格子
vis[i][j] = True # 将该格子标记为已经被访问过
if j == m-1: # 输出每个格子的数字
print(s[i][j])
else:
print(s[i][j], end=' ') # 如果该格子是一行的最后一个,则输出一个换行符
二、含2天数
count = 0 # 用来记录含有 2 的天数
for year in range(1900, 10000): # 从 1900 年开始,到 10000 年结束
for month in range(1, 13): # 从 1 月开始,到 12 月结束
if month in [1, 3, 5, 7, 8, 10, 12]: # 1, 3, 5, 7, 8, 10, 12 月份有 31 天
days = 31
elif month == 2: # 2 月份有 28 天,闰年有 29 天
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: # 判断是否是闰年
days = 29
else:
days = 28
else:
days = 30
for day in range(1, days+1): # 从 1 号开始,到 days 号结束
if '2' in str(year) or '2' in str(month).zfill(2) or '2' in str(day).zfill(2): # 判断年、月、日中是否含有 2
count += 1 # 如果含有 2,count 加 1
print(count)
以上是关于2023年4月刷题记录的主要内容,如果未能解决你的问题,请参考以下文章