力扣423(java)-从英文中重建数字(中等)
题目:
给你一个字符串 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 保证是一个符合题目要求的字符串
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reconstruct-original-digits-from-english
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
1.首先对每个字母进行词频统计;
2.可以观察出:
- z,w,u,x,g都只在0,2,4,6,8中出现,故这几个字母出现几次,这几个数字就出现几次;
- h只有3和8中出现,已知8的次数,可以得知3的次数;
- f只有4和5中出现,已知4的次数,可以得知5的次数;
- s只有6和7中出现,已知6的次数,可以得知7的次数;
- o有0、1、2、4中出现,前面已知0、2、4的次数,可以得知1的次数;
- i有5、6、8、9中出现,前面已知5、6、8的次数,可以得知9的次数。
3.然后按照升序进行添加,最后转换成字符串进行返回。
代码:
1 class Solution { 2 public String originalDigits(String s) { 3 int[] count = new int[26]; 4 for(int i = 0; i< s.length(); i++){ 5 count[s.charAt(i) - 'a'] ++; 6 } 7 int[] num = new int[10]; 8 num[0] = count['z' - 'a']; 9 num[2] = count['w' - 'a']; 10 num[6] = count['x' - 'a']; 11 num[8] = count['g' - 'a']; 12 num[4] = count['u' - 'a']; 13 num[3] = count['h' - 'a'] - num[8]; 14 num[5] = count['f' - 'a'] - num[4]; 15 num[7] = count['s' - 'a'] - num[6]; 16 num[1] = count['o' - 'a'] - num[0] - num[2] - num[4]; 17 num[9] = count['i' - 'a'] - num[5] - num[6] - num[8]; 18 StringBuffer res = new StringBuffer(); 19 for(int i = 0 ; i < 10; i++){ 20 for(int j = num[i]; j > 0; j--){ 21 res.append(i); 22 } 23 } 24 return res.toString(); 25 26 } 27 }