这个题我刚开始想复杂了,我以为除了这些组成数字的字符以外还会有别的字符,所有就写得非常麻烦。然后就发现它是除了组成数字的字符以外,就没有别的字符了,所以这个难度就减小了。但是感觉效率不高。
既然这个字符串里面只有构成数字的字符,那我们找到某些单词特有的字符,就相当于找到了这个数字,所以我们需要先观察从0~9的字符串,zero的’z‘是唯一的,two中的’w’是唯一的,four中的’u’是唯一的,six中的’x’是唯一的,eight中的g是唯一的,剩下的都是没有特征字符的。所以我们需要先把这几个筛选出来。
//处理0,2,4,6,8
while(map.getOrDefault('z', 0) > 0 ||
map.getOrDefault('w', 0) > 0||
map.getOrDefault('u', 0) > 0||
map.getOrDefault('x', 0) > 0||
map.getOrDefault('g', 0) > 0) {
while(map.getOrDefault('z',0) > 0) {
pq.add(0);
//减少HashMap中zero中的每个字母对应的value值
minusMap(map, "zero");
}
while(map.getOrDefault('w',0) > 0) {
pq.add(2);
minusMap(map, "two");
}
while(map.getOrDefault('u',0) > 0) {
pq.add(4);
minusMap(map, "four");
}
while(map.getOrDefault('x',0) > 0) {
pq.add(6);
minusMap(map, "six");
}
while(map.getOrDefault('g',0) > 0) {
pq.add(8);
minusMap(map, "eight");
}
}
再处理剩下的one,three,five,seven,nine,发现在这里面one的’o’是唯一的,five的’f’是唯一的,three的’r’是唯一的,就先将他们筛出来
while(map.getOrDefault('o', 0) > 0||
map.getOrDefault('f', 0)>0||
map.getOrDefault('r', 0)>0) {
while(map.getOrDefault('o',0) > 0) {
pq.add(1);
minusMap(map, "one");
}
while(map.getOrDefault('f',0) > 0) {
pq.add(5);
minusMap(map, "five");
}
while(map.getOrDefault('r',0) > 0) {
pq.add(3);
minusMap(map, "three");
}
}
接下来还剩下seven和nine,seven中的’v’是唯一的,nine中的’i’是唯一的,筛选出来
while(map.getOrDefault('v', 0) > 0||map.getOrDefault('i', 0)>0) {
while(map.getOrDefault('v',0) > 0) {
pq.add(7);
minusMap(map, "seven");
}
while(map.getOrDefault('i',0) > 0) {
pq.add(9);
minusMap(map, "nine");
}
}
接下来就将优先队列中的数字转成字符串
while(!pq.isEmpty())
sb.append(pq.poll());
这就是整个的过程
class Solution {
public String originalDigits(String s) {
HashMap<Character, Integer> map=new HashMap<Character, Integer>();
for(int i=0;i<s.length();i++)
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0)+1);
StringBuilder sb=new StringBuilder();
PriorityQueue<Integer> pq=new PriorityQueue<Integer>
while(map.getOrDefault('z', 0) > 0 ||map.getOrDefault('w', 0) > 0||map.getOrDefault('u', 0) > 0||map.getOrDefault('x', 0) > 0||map.getOrDefault('g', 0) > 0) {
while(map.getOrDefault('z',0) > 0) {
pq.add(0);
minusMap(map, "zero");
}
while(map.getOrDefault('w',0) > 0) {
pq.add(2);
minusMap(map, "two");
}
while(map.getOrDefault('u',0) > 0) {
pq.add(4);
minusMap(map, "four");
}
while(map.getOrDefault('x',0) > 0) {
pq.add(6);
minusMap(map, "six");
}
while(map.getOrDefault('g',0) > 0) {
pq.add(8);
minusMap(map, "eight");
}
}
while(map.getOrDefault('o', 0) > 0||map.getOrDefault('f', 0)>0||map.getOrDefault('r', 0)>0) {
while(map.getOrDefault('o',0) > 0) {
pq.add(1);
minusMap(map, "one");
}
while(map.getOrDefault('f',0) > 0) {
pq.add(5);
minusMap(map, "five");
}
while(map.getOrDefault('r',0) > 0) {
pq.add(3);
minusMap(map, "three");
}
}
while(map.getOrDefault('v', 0) > 0||map.getOrDefault('i', 0)>0) {
while(map.getOrDefault('v',0) > 0) {
pq.add(7);
minusMap(map, "seven");
}
while(map.getOrDefault('i',0) > 0) {
pq.add(9);
minusMap(map, "nine");
}
}
while(!pq.isEmpty())
sb.append(pq.poll());
return sb.toString();
}
public void minusMap(HashMap<Character, Integer> map, String num){
for(int i = 0; i < num.length(); i++)
map.put(num.charAt(i), map.get(num.charAt(i)) - 1);
}
}