题号423:
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字。按升序输出原始的数字。
注意:
输入只包含小写英文字母。
输入保证合法并可以转换为原始的数字,这意味着像 "abc" 或 "zerone" 的输入是不允许的。
输入字符串的长度小于 50,000。
示例 1:
输入: "owoztneoer"输出: "012" (zeroonetwo)
示例 2:
输入: "fviefuro"输出: "45" (fourfive)
解题思路:
e:zero/one/three/five/seven/eight/nine
f:four/five
g:eight
h:three/eight
i:five/six/eight/nine
n:one/seven/nine
o:zero/one/two/four
r:zero/three/four
s:six/seven
t:two/three/eight
u:four
v:five/seven
w:two
x:six
z:zero
其中,0、2、4、6、8可以通过字母z、w、u、x、g直接得出;
去掉0、2、4、6、8:
e:one/three/five/seven/nine
f:five
h:three
i:five/nine
n:one/seven/nine
o:one
r:three
s:seven
t:three
v:five/seven
可以发现数字1、3、5、7的个数也已可确定;
e:nine
i:nine
n:nine
最后确定9的个数。
代码实现:
class Solution {
public:
string originalDigits(string s) {
int count[15]=;// 统计e、f、g、h、i、n、o、r、s、t、u、v、w、x、z的数量
char c[15]={'e','f','g','h','i','n','o','r','s','t','u','v','w','x','z'};
for(int i=0;i
for(int j=0;j
if(s[i]==c[j]){
count[j]++;
break;
}
}
}
int res[10]=;
res[8]=count[2];// 8-eight
res[4]=count[10];// 4-four
res[2]=count[12];// 2-two
res[6]=count[13];// 6-six
res[0]=count[14];// 0-zero
count[1]=count[1]-count[10];// f
count[4]=count[4]-count[2]-count[13];// i
count[6]=count[6]-count[10]-count[12]-count[14];// o
count[7]=count[7]-count[10]-count[14];// r
count[8]=count[8]-count[13];// s
count[9]=count[9]-count[2]-count[12];// t
res[1]=count[6];// 1-one by o
res[3]=count[7];// 3-three by r
res[5]=count[1];// 5-five by f
res[7]=count[8];// 7-seven by s
count[9]=count[9]-count[7];// t
count[4]=count[4]-count[1];// i
res[9]=count[4];// 9-nine by i
string ss="";
for(int i=0;i
for(int j=0;j
ss+=to_string(i);
}
}
return ss;
}
};
看到有人写的思路一样但更简洁的代码:
string res = "";
int counts[128]=, nums[10]=;
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
for (int j = 0; j
res += (i + '0');
}
}
return res;
领取专属 10元无门槛券
私享最新 技术干货