Passion and Patience

Work Hard, Play Hard

导航

HJ23 删除字符串中出现次数最少的字符

利用list的排序来得到最小次数的字符,其中需要注意对map做深拷贝!卡了很久,因为不知道如何处理最小这一点

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case 
            String str = in.nextLine();
            List finalList = deLeast(str);
            for(int i = 0;i<str.length();i++){
                if(finalList.contains(str.charAt(i))){
                    System.out.print(str.charAt(i));
                }
            }
                       
        }
    }

    static List deLeast(String str){
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        for(int i = 0;i<str.length();i++){
            char c = str.charAt(i);
            if(map.containsKey(c)){
                int num = map.get(c);
                map.put(c,++num);
            }else{
                map.put(c,1);
            }
        }

        List<Integer> list = new ArrayList<Integer> (map.values());
        Collections.sort(list);
        Map<Character,Integer> mapCopy = new HashMap<Character,Integer>(map);
        for(char charAll : map.keySet()){
            if(map.get(charAll)==list.get(0)){
                mapCopy.remove(charAll);
            }
        }

        List<Character> listChar = new ArrayList<Character>(mapCopy.keySet());
        // for(int i = 0;i<list.size()-1;i++){
        //     map.remove()
        //     if(list.get(i)!=list.get(i+1)){
        //         list.removeIf(e -> e==)
        //     }
        // }
        // int min = list.get(0);
        // char[] chars = map.indexOf(min);

    //    List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet());
    //     //利用Collections的sort方法对list排序
    //     Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
    //         @Override
    //         public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
    //             //正序排列,倒序反过来
    //             return o1.getValue() - o2.getValue();
    //         }
    //     });

        return listChar;
    }
}

实际上直接.values循环遍历得到最小即可,以及重新用stringbuilder来重建一个数组:来源-秋榆梧桐

   public String delete(String str) {
        // Map记录每个字母的次数
        Map<Character, Integer> map = new HashMap<>();
        for (char ch : str.toCharArray()) {
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }
        // 快速找出最少次数
        int min = Integer.MAX_VALUE;
        for (int times : map.values()) {
            min = Math.min(min, times);
        }
        StringBuilder res = new StringBuilder();
        for (char ch : str.toCharArray()) {
            if (map.get(ch) != min) {
                res.append(ch);
            }
        }
        return res.toString();
    }

posted on 2024-04-24 17:01  安静的聆  阅读(25)  评论(0编辑  收藏  举报