6070. 计算字符串的数字和
给你一个由若干数字(0 - 9)组成的字符串 s ,和一个整数。
如果 s 的长度大于 k ,则可以执行一轮操作。在一轮操作中,需要完成以下工作:
将 s 拆分 成长度为 k 的若干 连续数字组 ,使得前 k 个字符都分在第一组,接下来的 k 个字符都分在第二组,依此类推。注意,最后一个数字组的长度可以小于 k 。
用表示每个数字组中所有数字之和的字符串来 替换 对应的数字组。例如,“346” 会替换为 “13” ,因为 3 + 4 + 6 = 13 。
合并 所有组以形成一个新字符串。如果新字符串的长度大于 k 则重复第一步。
返回在完成所有轮操作后的 s 。
示例 1:
输入:s = “11111222223”, k = 3
输出:“135”
解释:
- 第一轮,将 s 分成:“111”、“112”、“222” 和 “23” 。
接着,计算每一组的数字和:1 + 1 + 1 = 3、1 + 1 + 2 = 4、2 + 2 + 2 = 6 和 2 + 3 = 5 。
这样,s 在第一轮之后变成 “3” + “4” + “6” + “5” = “3465” 。- 第二轮,将 s 分成:“346” 和 “5” 。
接着,计算每一组的数字和:3 + 4 + 6 = 13 、5 = 5 。
这样,s 在第二轮之后变成 “13” + “5” = “135” 。
现在,s.length <= k ,所以返回 “135” 作为答案。
示例 2:
输入:s = “00000000”, k = 3
输出:“000”
解释:
将 “000”, “000”, and “00”.
接着,计算每一组的数字和:0 + 0 + 0 = 0 、0 + 0 + 0 = 0 和 0 + 0 = 0 。
s 变为 “0” + “0” + “0” = “000” ,其长度等于 k ,所以返回 “000” 。
提示:
1 <= s.length <= 100
2 <= k <= 100
s 仅由数字(0 - 9)组成。
代码1
其实是一道模拟题,我想的很麻烦,这是后来看的大佬的题解,豁然开朗,模拟题还是写的太少了。
class Solution {
public:
string digitSum(string s, int k) {
while (s.size() > k) {
string path;
int t = 0;
for (int i = 0; i < s.size(); i++) {
t += s[i] - '0';
if (i % k == k - 1 || i + 1 == s.size()) {
path += to_string(t);
t = 0;
}
}
s = path;
}
return s;
}
};
代码2
class Solution {
public:
string digitSum(string s, int k) {
while (s.size() > k) {
string path = ""; // 中间字符串
int l = 0;
while (l < s.size()) {
int t = 0;
for (int i = 0; i < k && l < s.size(); l++, i++) {
t += s[l] - '0';
}
path += to_string(t);
}
s = path;
}
return s;
}
};
6071. 完成所有任务需要的最少轮数
给你一个下标从 0 开始的整数数组 tasks ,其中 tasks[i] 表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。
返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 -1 。
示例 1:
输入:tasks = [2,2,3,3,2,4,4,4,4,4]
输出:4
解释:要想完成所有任务,一个可能的计划是:
- 第一轮,完成难度级别为 2 的 3 个任务。
- 第二轮,完成难度级别为 3 的 2 个任务。
- 第三轮,完成难度级别为 4 的 3 个任务。
- 第四轮,完成难度级别为 4 的 2 个任务。
可以证明,无法在少于 4 轮的情况下完成所有任务,所以答案为 4 。
示例 2:
输入:tasks = [2,3,3]
输出:-1
解释:难度级别为 2 的任务只有 1 个,但每一轮执行中,只能选择完成 2 个或者 3 个相同难度级别的任务。因此,无法完成所有任务,答案为 -1 。
提示:
1 <= tasks.length <= 105
1 <= tasks[i] <= 109
代码
感觉这题也挺简单的,只要利用map的键值对应的性质,然后记录下每个等级的个数,遍历判断即可
因为一次可以完成两个或者三个同等级的任务,所以如果大于三个,默认先完成三个的任务
- 只要有某个等级数量为1,那就不可能遍历完,直接返回-1。
- 如果某个等级恰好有 2 个,轮数+1
- 如果正好被3整除,轮数 + n / 3
- 除3之后多出来一个,那就取出最后4个,2+2完成
- 除3之后多出来2个,最后两个单独完成即可
共五种情况,最后4,5可以合并为 n % 3 != 0 有余数,+ n/3 + 1
class Solution {
public:
int minimumRounds(vector<int>& tasks) {
map<int, int> mp;
for (auto i : tasks) mp[i]++;
int res = 0;
for (auto i = mp.begin(); i != mp.end(); i++) {
int t = i->second;
if (t == 1) return -1;
else if (t == 2) res++;
else if (t % 3 == 0) res += t / 3;
else res += t / 3 + 1;
}
return res;
}
};