本文是对第 287 场周赛的复盘总结
6055. 转化时间需要的最少操作数
#模拟题
题目描述
给你两个字符串 current 和 correct ,表示两个 24 小时制时间 。
24 小时制时间 按 “HH:MM” 进行格式化,其中 HH 在 00 和 23 之间,而 MM 在 00 和 59 之间。最早的 24 小时制时间为 00:00 ,最晚的是 23:59 。
在一步操作中,你可以将 current 这个时间增加 1、5、15 或 60 分钟。你可以执行这一操作 任意 次数。
返回将 current 转化为 correct 需要的 最少操作数 。
1 | 示例 1: |
解题思路
(1). 本题其实是变种的零钱问题。初始状态是 current,最终状态是 correct,可用“零钱”面额有 [1,5,15,60];
(2). 现将初始、最终两种状态转换成和“零钱”面额一样的计数单位——“分钟”;
(3). 使用动态规划,从初始状态一步步向最终状态逼近。
时间复杂度
O(N).
解题代码
1 | func convertTime(current string, correct string) int { |
5235. 找出输掉零场或一场比赛的玩家
#map
题目描述
给你一个整数数组 matches 其中 matches[i] = [winneri, loseri] 表示在一场比赛中 winneri 击败了 loseri 。
返回一个长度为 2 的列表 answer :
answer[0] 是所有 没有 输掉任何比赛的玩家列表。
answer[1] 是所有恰好输掉 一场 比赛的玩家列表。
两个列表中的值都应该按 递增 顺序返回。
注意:
只考虑那些参与 至少一场 比赛的玩家。
生成的测试用例保证 不存在 两场比赛结果 相同 。
1 | 示例 1: |
解题思路
(1). 本题需要输出两个列表:其一是 入度 为 $0$ 且 出度 大于 $0$ 的编号,其二是 入度 恰好为 $1$ 的编号;
(2). 使用两个 map 分别保存每个编号的出度和入度;
(3). 首先遍历 入度 map,只要发现其长度为 $1$,那就加入输出中;
(4). 然后遍历 出度 map,检查对应编号的 入度 列表如果为 $0$,那么也加入输出中;
(5). 排序两个列表。
时间复杂度
O(N)
解题代码
1 | func findWinners(matches [][]int) [][]int { |
5219. 每个小孩最多能分到多少糖果
#二分查找
题目描述
给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。
另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。
返回每个小孩可以拿走的 最大糖果数目 。
1 | 示例 1: |
解题思路
(1). 首先看一看数据量,明显暴力绝对会超时,那么别无选择,二分法搞起来;
(2). 首先判断一下边界情况,当 🍬总数 < 🧒总数 时,显然大家都没得分,return 0;如果 🍬总数 == 🧒总数 ,return 1
(3) 二分查找的左边界是 $1$,右边界是 🍬总数/🧒总数 ;
(4) 要查找满足条件的右边界,二分超找模板套起来。
时间复杂度
O(Nlog(N))
解题代码
1 | func maximumCandies(candies []int, k int64) int { |
5302. 加密解密字符串
#设计题
题目描述
给你一个字符数组 keys ,由若干 互不相同 的字符组成。还有一个字符串数组 values ,内含若干长度为 2 的字符串。另给你一个字符串数组 dictionary ,包含解密后所有允许的原字符串。请你设计并实现一个支持加密及解密下标从 0 开始字符串的数据结构。
字符串 加密 按下述步骤进行:
1.对字符串中的每个字符 c ,先从 keys 中找出满足 keys[i] == c 的下标 i 。
2.在字符串中,用 values[i] 替换字符 c 。
字符串 解密 按下述步骤进行:
1.将字符串每相邻 2 个字符划分为一个子字符串,对于每个子字符串 s ,找出满足 values[i] == s 的一个下标 i 。如果存在多个有效的 i ,从中选择 任意 一个。这意味着一个字符串解密可能得到多个解密字符串。
2.在字符串中,用 keys[i] 替换 s 。
实现 Encrypter 类:
1.Encrypter(char[] keys, String[] values, String[] dictionary) 用 keys、values 和 dictionary 初始化 Encrypter 类。
2.String encrypt(String word1) 按上述加密过程完成对 word1 的加密,并返回加密后的字符串。
3.int decrypt(String word2) 统计并返回可以由 word2 解密得到且出现在 dictionary 中的字符串数目。
解题思路
(1). 注意到 values 中有相同的字符串,因此不同的字符串加密后可能是一样的,从而一个字符串解密出的结果可能不是唯一的;
(2). 根据提示 1,直接解密较为复杂,不妨逆向思考,即加密 dictionary 中的每个字符串。用哈希表记录每个加密后的字符串的出现次数。这样每次调用 decrypt 时,返回哈希表中 word2 的出现次数即可。
解题代码
1 | type Encrypter struct { |
- Post title:早起刷题(Day 6)
- Post author:洪笳淏
- Create time:2022-04-04 08:00:00
- Post link:https://jiahaohong1997.github.io/2022/04/04/早起刷题(Day 6)/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.