https://leetcode-cn.com/problems/reconstruct-original-digits-from-english/
题目
给你一个字符串s,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按升序返回原始的数字。
示例1
输入:s = "owoztneoer"
输出:"012"
注:s可以调整顺序为"zeroonetwo",即012
示例2
输入:s = "fviefuro"
输出:"45"
注:s可以调整顺序为"fourfive",即45
思路1
比较奇葩的一个找规律题目。我们可以分析0~9这数字所对应单词中包含的字母:
one two three four five six seven eight nine
可以发现z、w、u、x、g各自只会在一种数字中出现。因此,我们统计这几种字母的数目的话,就可以推出相应数字的出现次数:
unordered_map<char, int> c;
for (char ch: s) {
++c[ch];
}
vector<int> cnt(10);
cnt[0] = c['z'];
cnt[2] = c['w'];
cnt[4] = c['u'];
cnt[6] = c['x'];
cnt[8] = c['g'];
那么同理,h、f、s分别只在3&8,4&5,6&7中出现,由于上面我们已经推出了8,4,6的出现次数,因此现在可以得到3,5,7的出现次数:
cnt[3] = c['h'] - cnt[8];
cnt[5] = c['f'] - cnt[4];
cnt[7] = c['s'] - cnt[6];
出现三次、四次的推导类似,这里不再重复阐述。最终代码如下:
string originalDigits(string s) {
unordered_map<char, int> c;
for (char ch: s) {
++c[ch];
}
vector<int> cnt(10);
cnt[0] = c['z'];
cnt[2] = c['w'];
cnt[4] = c['u'];
cnt[6] = c['x'];
cnt[8] = c['g'];
cnt[3] = c['h'] - cnt[8];
cnt[5] = c['f'] - cnt[4];
cnt[7] = c['s'] - cnt[6];
cnt[1] = c['o'] - cnt[0] - cnt[2] - cnt[4];
cnt[9] = c['i'] - cnt[5] - cnt[6] - cnt[8];
string ans;
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < cnt[i]; ++j) {
ans += char(i + '0');
}
}
return ans;
}