leetcode:423. 从英文中重建数字

题目来源

题目描述

在这里插入图片描述

题目解析

我们知道,每个数字对应一个英文单词,“zero”, “one”, “two”, “three”, “four”, “five”, “six”, “seven”, “eight”, “nine”,如果去观察每个英文单词在这些单词中出现的情况,我们可以发现:

  • 有些单词的字符是独一无二的
    • 比如z,只出现在zero
    • 还有w,u,x,g这四个单词,分别只出现在two,four,six,eight
    • 那么这五个数字的个数就可以被确定了
  • 有些单词会出现很多次
    • 由于含有o的单词有zero,two,four,one,其中前三个都被确定了,那么one的个数也就知道了
    • 由于含有h的单词有eight,three,其中eight个数已知,那么three的个数就知道了
    • 由于含有f的单词有four,five,其中four个数已知,那么five的个数就知道了;
    • 由于含有s的单词有six,seven,其中six个数已知,那么seven的个数就知道了;
    • 由于含有i的单词有six,eight,five,nine,其中前三个都被确定了,那么nine的个数就知道了

思路:先要统计出各个字符出现的次数,然后算出每个单词出现的次数,然后就可以重建了。

class Solution {
public:
    string originalDigits(string s) {
        string res = "";
        vector<string> words{"zero", "two", "four", "six", "eight", "one", "three", "five", "seven", "nine"};
        vector<int> nums{0, 2, 4, 6, 8, 1, 3, 5, 7, 9}, counts(26, 0);
        vector<char> chars{'z', 'w', 'u', 'x', 'g', 'o', 'h', 'f', 's', 'i'};
        for (char c : s) ++counts[c - 'a'];
        for (int i = 0; i < 10; ++i) {
            int cnt = counts[chars[i] - 'a'];
            for (int j = 0; j < words[i].size(); ++j) {
                counts[words[i][j] - 'a'] -= cnt;
            }
            while (cnt--) res += (nums[i] + '0');
        }
        sort(res.begin(), res.end());
        return res;
    }
};
class Solution {
public:
    string originalDigits(string s) {
        std::string res = "";
        vector<int> counts(128, 0), nums(10, 0);
        for (char c : s) {
            ++counts[c];
        }
        nums[0] = counts['z'];
        nums[2] = counts['w'];
        nums[4] = counts['u'];
        nums[6] = counts['x'];
        nums[8] = counts['g'];
        nums[1] = counts['o'] - nums[0] - nums[2] - nums[4];
        nums[3] = counts['h'] - nums[8];
        nums[5] = counts['f'] - nums[4];
        nums[7] = counts['s'] - nums[6];
        nums[9] = counts['i'] - nums[6] - nums[8] - nums[5];
        for (int i = 0; i < 10; ++i) {
            for (int j = 0; j < nums[i]; ++j) {  // 出现了几个1,出现了几个2,出现了几个3
                res += (i + '0');
            }
        }
        return res;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值