Leetcode 第 289 场周赛

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,那就不可能遍历完,直接返回-1。
  2. 如果某个等级恰好有 2 个,轮数+1
  3. 如果正好被3整除,轮数 + n / 3
  4. 除3之后多出来一个,那就取出最后4个,2+2完成
  5. 除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;
    }
};

版权声明:本文为Changersh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。