这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
题目
给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。
示例
输入: s = "owoztneoer"
输出: "012"
输入: s = "fviefuro"
输出: "45"
提示
1 <= s.length <= 10^5s[i]为["e","g","f","i","h","o","n","s","r","u","t","w","v","x","z"]这些字符之一s保证是一个符合题目要求的字符串
解题思路
排除法
数字0 - 9对应的英文单词为:[zero, one, two, three, four, five, six, seven, eight, nine]。
对照表如下所示:
这样子的排列看上去比较乱,很难直观的抽取出不同点。我们可以根据提示信息中给出的参考(["e","g","f","i","h","o","n","s","r","u","t","w","v","x","z"]),将其按照字母进行排序对比:
通过该表格可以看出有些字母仅被一个数字使用,有些字母则有多个字母使用。那么我们可以按照从少到多,从小到大(题目要求返回结果为升序)的顺序对其进行排序:
我们可通过表格中标记为红色的数字前对应的字母来判断该数字是否出现在字符串s中。
z,w,u,x,g这五个字母有着属于自己独有的数字,所以我们可以直接判断得出结果。
h,f,s,v这四个后面均有两个对应的数字,但其中一个数字为z,w,u,x,g中独有的数字,因此我们可以通过减去前面的数字进行排查,即可得出所需要的结果。
o,r,t,i,n,e等与h,f,s,v一样有着多个对应的数字,需要通过排除的方式来取得结果。
class Solution {
private static final char a = 'a';
public String originalDigits(String s) {
int[] c = new int[26];
// 统计字母出现此时
for(char sChar : s.toCharArray()){
++c[sChar - a];
}
int[] cnt = new int[10];
// z,w,u,x,g
cnt[0] = c['z' - a];
cnt[2] = c['w' - a];
cnt[4] = c['u' - a];
cnt[6] = c['x' - a];
cnt[8] = c['g' - a];
// h,f,s,v 其中v对应的 5 7 已经在前面筛选过,可以不使用
cnt[3] = c['h' - a] - cnt[8];
cnt[5] = c['f' - a] - cnt[4];
cnt[7] = c['s' - a] - cnt[6];
// o,r,t,i,n,e 其中r,t,n,e对应的已经在前面筛选过,可以不使用
cnt[1] = c['o' - a] - cnt[0] - cnt[2] - cnt[4];
cnt[9] = c['i' - a] - cnt[5] - cnt[6] - cnt[8];
StringBuilder sb = new StringBuilder();
// 按照从小到大的顺序拼接
for(int i = 0; i < 10; ++i){
// 有多少个数字则拼接多少个对应数字
for(int j = 0; j < cnt[i]; ++j){
sb.append((char)(i + '0'));
}
}
// 返回结果
return sb.toString();
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!