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/

题意:

给你两个正整数 ab ,返回 ab 因子的数目。

如果 x 可以同时整除 ab ,则认为 xab 的一个 公因子




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 小时内吃掉所有香蕉的最小速度 kk 为整数)。




2023年4月8日

leetcode1409. 查询带键的排列

链接地址:https://leetcode.cn/problems/queries-on-a-permutation-with-key/

题意:

给你一个待查数组 queries ,数组中的元素为 1m 之间的正整数。 请你根据以下规则处理所有待查项 queries[i](从 i=0i=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

字母表中的每个字母按从 025 依次编号(即,\'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 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序1n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。

游戏遵循如下规则:

  1. 从第 1 名小伙伴所在位置 开始
  2. 沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。
  3. 你数到的最后一名小伙伴需要离开圈子,并视作输掉游戏。
  4. 如果圈子中仍然有不止一名小伙伴,从刚刚输掉的小伙伴的 顺时针下一位 小伙伴 开始,回到步骤 2 继续执行。
  5. 否则,圈子中最后一名小伙伴赢得游戏。

给你参与游戏的小伙伴总数 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 个花园,按从 1n 标记。另有数组 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 计划分别去罗马开会。

给你四个字符串 arriveAliceleaveAlicearriveBobleaveBob 。Alice 会在日期 arriveAliceleaveAlice 之间在城市里(日期为闭区间),而 Bob 在日期 arriveBobleaveBob 之间在城市里(日期为闭区间)。每个字符串都包含 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,找出存在于 不同 节点 AB 之间的最大值 V,其中 V = |A.val - B.val|,且 AB 的祖先。

(如果 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)。

给你三个整数 lohik 。你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序

请你返回区间 [lo, hi] 之间的整数按权重排序后的第 k 个数。

注意,题目保证对于任意整数 x (lo <= x <= hi) ,它变成 1 所需要的步数是一个 32 位有符号整数。




2023年4月21日

leetcode2413. 最小偶倍数

链接地址:https://leetcode.cn/problems/smallest-even-multiple/

题意:

给你一个正整数 n ,返回 2n 的最小公倍数(正整数)。




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

对于每个下标 inames[i]heights[i] 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 names




2023年4月26日

leetcode1031. 两个非重叠子数组的最大和

链接地址:https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays/

题意:

给你一个整数数组 nums 和两个整数 firstLensecondLen,请你找出并返回两个非重叠 子数组 中元素的最大和长度分别为 firstLensecondLen

长度为 firstLen 的子数组可以出现在长为 secondLen 的子数组之前或之后,但二者必须是不重叠的。

子数组是数组的一个 连续 部分。




2023年4月27日

leetcode1048. 最长字符串链

链接地址:https://leetcode.cn/problems/longest-string-chain/

题意:

给出一个单词数组 words ,其中每个单词都由小写英文字母组成。

如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么我们认为 wordAwordB前身

  • 例如,"abc""abac"前身 ,而 "cba" 不是 "bcad"前身

词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word1word2 的前身,word2word3 的前身,依此类推。一个单词通常是 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/

题意:

三枚石子放置在数轴上,位置分别为 abc

每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这三枚石子当前分别位于位置 x, y, zx < y < z。那么就可以从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < zk != 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,对于每个没有地雷的位置,遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量,最后输出整个方格图。

具体实现步骤如下:

  1. 读入 n, m 表示方格图的行数和列数。
  2. 定义一个列表 dir,其中包含八个方向的坐标偏移量,用于表示每个位置周围的八个位置。
  3. 定义一个空列表 s 用于存储方格图。
  4. 定义一个二维列表 vis,用于表示某个位置是否被访问过。
  5. 读入方格图,将其存入列表 s 中,并初始化 vis 为全 False。
  6. 遍历整个方格图,对于每个位置,如果它是有地雷的位置,则将其标记为9,否则遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量。
  7. 在遍历过程中,将该位置的 vis 标记为 True,表示已访问。
  8. 输出整个方格图。
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月刷题记录的主要内容,如果未能解决你的问题,请参考以下文章

wy的leetcode刷题记录_Day66

分享(含OracleMySQL等) | 2023年4月刊

数据结构刷题2023.02.15小记

2023年3月27日

学习记录2023年1月31日

2022年总结 && 2023展望