题目来源
题目描述
题目解析
我们知道,每个数字对应一个英文单词,“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;
}
};