给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9
。按升序输出原始的数字。
注意:
- 输入只包含小写英文字母。
- 输入保证合法并可以转换为原始的数字,这意味着像 "abc" 或 "zerone" 的输入是不允许的。
- 输入字符串的长度小于 50,000。
示例 1:
输入: "owoztneoer"
输出: "012" (zeroonetwo)
示例 2:
输入: "fviefuro"
输出: "45" (fourfive)
思路:观察发现,zero、two、four、six、eight中具有独一无二的字母,利map统计出每个字符的个数,求出这5个数字的个数后,剩下的有4个数字one、three、five、seven中具有独一无二的字母,最后一个数字nine的个数可以通过字母i的个数减去字母f的个数得到。
C++
class Solution {
public:
string originalDigits(string s)
{
int a[10]={0};
int n=s.length();
map<char,int> dic;
for(int i=0;i<n;i++)
{
if(dic.count(s[i])<1)
{
dic.insert(pair<char,int>(s[i],1));
}
else
{
dic[s[i]]+=1;
}
}
for(int i=0;i<n;i++)
{
if(s[i]=='z')
{
a[0]++;
dic['e']--;
dic['r']--;
dic['o']--;
}
if(s[i]=='w')
{
a[2]++;
dic['t']--;
dic['o']--;
}
if(s[i]=='u')
{
a[4]++;
dic['f']--;
dic['o']--;
dic['r']--;
}
if(s[i]=='x')
{
a[6]++;
dic['s']--;
dic['i']--;
}
if(s[i]=='g')
{
a[8]++;
dic['e']--;
dic['i']--;
dic['h']--;
dic['t']--;
}
}
a[1]=dic['o'];
a[3]=dic['t'];
a[5]=dic['f'];
a[7]=dic['s'];
a[9]=dic['i']-dic['f'];
string res;
for(int i=0;i<10;i++)
{
//for(int j=0;j<a[i];j++)
//{
// res.push_back(i+'0');
//}
res.insert(res.end(),a[i],i+'0');
}
return res;
}
};
python
class Solution:
def originalDigits(self, s):
"""
:type s: str
:rtype: str
"""
#dic={}
dic={'e':0,'f':0,'g':0,'h':0,'i':0,'n':0,'o':0,'r':0,'s':0,'t':0,'u':0,'v':0,'w':0,'x':0,'z':0}
n=len(s)
a=[0 for i in range(10)]
for i in range(0,n):
#if s[i] not in dic:
if dic[s[i]]==0:
dic[s[i]]=1
else:
dic[s[i]] += 1
for i in range(0,n):
if s[i]=='z':
a[0] += 1
dic['e'] -= 1
dic['r'] -= 1
dic['o'] -= 1
if s[i]=='w':
a[2] += 1
dic['t'] -= 1
dic['o'] -= 1
if s[i]=='u':
a[4] += 1
dic['f'] -= 1
dic['o'] -= 1
dic['r'] -= 1
if s[i]=='x':
a[6] += 1
dic['s'] -= 1
dic['i'] -= 1
if s[i]=='g':
a[8] += 1
dic['e'] -= 1
dic['i'] -= 1
dic['h'] -= 1
dic['t'] -= 1
a[1]=dic['o']
a[3]=dic['t']
a[5]=dic['f']
a[7]=dic['s']
a[9]=dic['i']-dic['f']
res=''
for i in range(0,10):
res += str(i)*a[i]
return res