字符统计(算法)

2022-12-14 18:32:31 浏览数 (1)

输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。

数据范围:字符串长度满足 1 le len(str) le 1000 1≤len(str)≤1000

输入描述:

一个只包含小写英文字母和数字的字符串。

输出描述:

一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。

思路:

首先把字符串翻转,因为是从后往前排序。

再把字段出现次数相同的字符排序,所以这里涉及两个排序,第一个是数据顺序本身,第二个按ASCII。

1.先用map统计每个字符出现的次数。

2、在通过次数来用map分组。

3、不同的字符对应map来排序。

代码语言:javascript复制
 public static void main(String[] args) {
     Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        String newString = new StringBuffer(string).reverse().toString();
        List<String> stringList = new ArrayList<>();
        StringBuffer stringBuffer = new StringBuffer();
        HashMap<String, Long> map = new HashMap<>();
        for (int i = 0; i < newString.length(); i  ) {
            map.put(String.valueOf(newString.charAt(i)), map.getOrDefault(String.valueOf(newString.charAt(i)), 0L)   1);
            if (!stringList.contains(String.valueOf(newString.charAt(i)))) {
                stringBuffer.append(newString.charAt(i));
                stringList.add(String.valueOf(newString.charAt(i)));
            }
        }
         TreeMap<Long, List<String>> mapString = new TreeMap<>();
        Set<Map.Entry<String, Long>> entries = map.entrySet();
        Iterator<Map.Entry<String, Long>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Long> next = iterator.next();
            if(!mapString.containsKey(next.getValue())){
                // 不包含直接放入
                mapString.put(next.getValue(), Arrays.asList(next.getKey()));
            }else{
                // 包含则 增加
                List<String> stringList1 = mapString.get(next.getValue());
                List<String> stringListNew  = new ArrayList<>();
                stringListNew.add(next.getKey());
                stringListNew.addAll(stringList1);
                mapString.put(next.getValue(), stringListNew);
            }
        }
        // 根据个数排序
 
        Iterator<Map.Entry<Long, List<String>>> iteratorSort = mapString.entrySet().iterator();
        List<String> finalList = new ArrayList<>();
        while(iteratorSort.hasNext()){
            Map.Entry<Long, List<String>> next = iteratorSort.next();
            List<String> value = next.getValue();
              value = value.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
            finalList.addAll(value);
        }
 
         for (int size = finalList.size()-1; size >= 0; size--) {
            System.out.print(finalList.get(size));
        }
    }

0 人点赞