力扣 423 从英文中重建数字

在这里插入图片描述

   这个题我刚开始想复杂了,我以为除了这些组成数字的字符以外还会有别的字符,所有就写得非常麻烦。然后就发现它是除了组成数字的字符以外,就没有别的字符了,所以这个难度就减小了。但是感觉效率不高。
   既然这个字符串里面只有构成数字的字符,那我们找到某些单词特有的字符,就相当于找到了这个数字,所以我们需要先观察从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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121529323