423. 从英文中重建数字

423. 从英文中重建数字

给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。

例 1:

输入:s = "owoztneoer"
输出:"012"

示例 2:

输入:s = "fviefuro"
输出:"45"

提示:

  • 1 <= s.length <= 105
  • s[i] 为 [“e”,“g”,“f”,“i”,“h”,“o”,“n”,“s”,“r”,“u”,“t”,“w”,“v”,“x”,“z”] 这些字符之一
  • s 保证是一个符合题目要求的字符串

解题思路

首先我们可以统计每个字母分别在哪些数字中出现:

字母	数字
e	0 1 3 5 7 8 9
f	4 5
g	8
h	3 8
i	5 6 8 9
n	1 7 9
o	0 1 2 4
r	0 3 4
s	6 7
t	2 3 8
u	4
v	5 7
w	2
x	6
z	0
  1. 我们发现对于guwxz,他们只在特定的数字8 4 2 6 0里面出现,因此我们只有检查到这些字母,就可以确定其对应数字的出现次数.
  2. 对于h来说,它出现在3 8两个数字里面,因为我们通过g可以得出8的出现次数,因此我们可以通过这个得出3的出现次数。
  3. 对于s来说,它出现在6 7两个数字里面,因为我们通过x可以得出7的出现次数,因此我们可以通过这个得出6的出现次数。
  4. 对于f来说,它出现在5 4两个数字里面,因为我们通过u可以得出4的出现次数,因此我们可以通过这个得出5的出现次数。
  5. 因为o在0 1 2 4中出现,在上面我们已经求出了1 2 4 的出现次数,因此同理可得0的出现次数
  6. 因为i在5 6 8 9中出现,在上面我们已经求出了5 6 8 的出现次数,因此同理可得9的出现次数

代码

class Solution {
public:
    string originalDigits(string s) {

        map<char,int> m;
        for (auto  c:s) ++m[c];
        m['8']=m['g'];
        m['4']=m['u'];
        m['2']=m['w'];
        m['6']=m['x'];
        m['0']=m['z'];

        m['3']=m['h']-m['8'];
        m['7']=m['s']-m['6'];
        m['5']=m['f']-m['4'];

        m['1']=m['o']-m['0']-m['2']-m['4'];
        m['9']=m['i']-m['5']-m['6']-m['8'];

        string  res;
        for (int i = 0; i < 10; ++i) {
            for (int j = 0; j < m['0'+i]; ++j) {
                res+=char ('0'+i);
            }
        }
        return res;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值