LeetCode 第 289 场周赛 题解及思路
6070. 计算字符串的数字和
题目太啰嗦,简要概括如下:
给定一个全部由数字字符(
0
-9
)组成的字符串s
和一个整数k
。只要当s
长度 大于k
时,便进行分组迭代,具体规则是将s
从头到尾切分成多个由k
个字符组成的子字符串(最后一个子字符串允许长度小于k
),将每个子字符串中的每个字符所代表的数字相加,并将得到的数字重新转换成字符串形式,依次相连得到下一次迭代的字符串。
所以简单地进行模拟即可,注意每次迭代时最后一个子字符串长度可以小于 k
。
while (s.size() > k) {
string ss;
int index = 0, n = s.size();
while (index < n) {
int tot = 0, cnt = 0;
while (index < n && cnt++ < k) tot += s[index++] - '0';
ss.append(to_string(tot));
};
s = ss;
};
完整代码见 GitHub。
6071. 完成所有任务需要的最少轮数
给定一个下标从 0 开始的整数数组
tasks
,其中tasks[i]
表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回-1
。
先对级别难度相同的任务计数,然后就是要在满足 2x + 3y = tasks[i]
的前提下使得 x + y
尽可能小。
unordered_map<int, int> counts;
for (const int& task : tasks)
counts[task]++;
最简单的方法是遍历 x
求解,但由于数据量大小在 10^5
显然超时。于是想到要尽可能使得 y
大一些(因为 y
的系数比 x
大),即令 y =