leetcode weekly contest 407
3226. 使两个整数相等的位更改次数
给你两个正整数 n 和 k。
你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。
返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。
示例 1:
输入: n = 13, k = 4
输出: 2
解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2,
我们可以改变 n 的第一位和第四位。结果整数为 n = (**0**10**0**)2 = k。
示例 2:
输入: n = 21, k = 21
输出: 0
解释:n 和 k 已经相等,因此不需要更改。
示例 3:
输入: n = 14, k = 13
输出: -1
解释:
无法使 n 等于 k。
提示:
1 <= n, k <= 106
地址
题意
模拟
思路
- 统计 $n$ 与 $k$ 两个数中数位不同的个数即可。
- 复杂度分析:
- 时间复杂度:$O(1)$。
- 空间复杂度:$O(1)$。
代码
class Solution: |
3227. 字符串元音游戏
小红和小明在玩一个字符串元音游戏。
给你一个字符串 s,小红和小明将轮流参与游戏,小红 先 开始:
- 在小红的回合,她必须移除
s中包含 奇数 个元音的任意 非空 子字符串。 - 在小明的回合,他必须移除
s中包含 偶数 个元音的任意 非空 子字符串。
第一个无法在其回合内进行移除操作的玩家输掉游戏。假设小红和小明都采取 最优策略 。
如果小红赢得游戏,返回 true,否则返回 false。
英文元音字母包括:a, e, i, o, 和 u。
示例 1:
输入: s = “leetcoder”
输出: true
解释:
小红可以执行如下移除操作来赢得游戏:
- 小红先手,她可以移除加下划线的子字符串
s = "**leetco**der",其中包含 3 个元音。结果字符串为s = "der"。 - 小明接着,他可以移除加下划线的子字符串
s = "**d**er",其中包含 0 个元音。结果字符串为s = "er"。 - 小红再次操作,她可以移除整个字符串
s = "**er**",其中包含 1 个元音。 - 又轮到小明,由于字符串为空,无法执行移除操作,因此小红赢得游戏。
示例 2:
输入: s = “bbcd”
输出: false
解释:
小红在她的第一回合无法执行移除操作,因此小红输掉了游戏。
提示:
1 <= s.length <= 105s仅由小写英文字母组成。
地址
https://leetcode.cn/contest/weekly-contest-407/problems/vowels-game-in-a-string/
题意
模拟
思路
- 本质即为统计字符串出现元音字符的数目,假设字符串中出现元音字符的个数为 $x$ 且满足 $x > 0$,则此时最多经过两次即可取玩:
- 如果 $x$ 为奇数,则小红先手可以一次把字符串全部取完,此时小明会输;
- 如果 $x$ 为偶数,则小红可以先取奇数个字符,然后剩余的元音字符也为奇数个,此时小明只能取偶数个,因此无论如何取,小红在下一回去取得时候一定可以把所有得字符全部取完;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定字符串得长度。
- 空间复杂度:$O(1)$;
代码
class Solution: |
3228. 将 1 移动到末尾的最大操作次数
给你一个 二进制字符串 s。
你可以对这个字符串执行 任意次 下述操作:
- 选择字符串中的任一下标
i(i + 1 < s.length),该下标满足s[i] == '1'且s[i + 1] == '0'。 - 将字符
s[i]向 右移 直到它到达字符串的末端或另一个'1'。例如,对于s = "010010",如果我们选择i = 1,结果字符串将会是s = "0**001**10"。
返回你能执行的 最大 操作次数。
示例 1:
输入: s = “1001101”
输出: 4
解释:
可以执行以下操作:
- 选择下标
i = 0。结果字符串为s = "**001**1101"。 - 选择下标
i = 4。结果字符串为s = "0011**01**1"。 - 选择下标
i = 3。结果字符串为s = "001**01**11"。 - 选择下标
i = 2。结果字符串为s = "00**01**111"。
示例 2:
输入: s = “00111”
输出: 0
提示:
1 <= s.length <= 105s[i]为'0'或'1'。
地址
https://leetcode.cn/contest/weekly-contest-406/problems/minimum-cost-for-cutting-cake-i/
题意
直接模拟
思路
我们可以观察到,假设字符得末尾全部是 $1$ 则一定无法移动,我们从左到右遍历字符串,此时假设当前已经有 $x$ 个 $1$,此时遇到下一次 $01$ 交替时,我们一定可以移动 $x$ 次,此时接着连续有 $y$ 个 $1$,则此时遇到下一个 $01$,则一定可以移动 $x+ y$ 次,我们按照上诉方式模拟即可。
复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定字符串的长度;
- 空间复杂度:$O(1)$;
代码
class Solution: |
3229. 使数组等于目标数组所需的最少操作次数
给你两个长度相同的正整数数组 nums 和 target。
在一次操作中,你可以选择 nums 的任何子数组,并将该子数组内的每个元素的值增加或减少 1。
返回使 nums 数组变为 target 数组所需的 最少 操作次数。
示例 1:
输入: nums = [3,5,1,2], target = [4,6,2,4]
输出: 2
解释:
执行以下操作可以使 nums 等于 target:
- nums[0..3] 增加 1,nums = [4,6,2,3]。
- nums[3..3] 增加 1,nums = [4,6,2,4]。
示例 2:
输入: nums = [1,3,2], target = [2,1,4]
输出: 5
解释:
执行以下操作可以使 nums 等于 target:
- nums[0..0] 增加 1,nums = [2,3,2]。
- nums[1..1] 减少 1,nums = [2,2,2]。
- nums[1..1] 减少 1,nums = [2,1,2]。
- nums[2..2] 增加 1,nums = [2,1,3]。
- nums[2..2] 增加 1,nums = [2,1,4]。
提示:
1 <= nums.length == target.length <= 1051 <= nums[i], target[i] <= 108
地址
题意
模拟,差分数组
思路
- 假设将两个数组变为相同,此时我们分别统计哪些数据需要递增,哪些数据需要递减,此时形成一些波峰,由于每次操作只能加$1$ 或者 减 $1$ ,此时我们尽可能使得数 $x$ 变为数 $y$ 的操作次数均为 $|x-y|$, 这个贪心算法证明还是挺难的,但是我们很容易计算出来。只需要计算上升沿的所有数字之和即可。
- 差分数组的思想比较难想,但是整体思路还是可以的。
- 复杂度分析:
- 时间复杂度:$O((m + n) \log (m + n)$,其中 $m,n$ 表示给的数;
- 空间复杂度:$O(m + n)$,其中 $m,n$ 表示给的数;
代码
class Solution: |
欢迎关注和打赏,感谢支持!
关注我的博客: https://mike-box.github.io/
关注我的微信公众号: 哪些奋斗者

扫描二维码,分享此文章