华为OD机试 - 字符统计及重排 - 数据结构list、排序(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
      • java8 Stream简化代码:
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序。

输出各个字母及其出现次数。

如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。

二、输入描述

输入一行,为一个仅包含字母的字符串。

三、输出描述

按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号字母和次数间用英文冒号分隔。

输入 输出 说明
xyxyXX x:2;y:2;X:2; 1. 每个字符出现的次数都是2;
2. 先按小写字母自然排序,再按大写字母自然排序
3. 输出x:2;y:2;X:2;
abababb b:4;a:3; 按照每个字符出现的次数排序即可,输出b:4;a:3;

四、解题思路

本题比较简单,就是逻辑分析,按照题意解题即可。

按照字母出现次数从大到小的顺序,如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。

  1. 定义map,存储存储每个字符的个数;
  2. 统计字符串中各个字母(区分大小写)出现的次数并按照字母出现次数从大到小的顺序。
    • 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前;
      • 获取字符的ascii码(大写字符+100,保证小写字母在大写字母之前);
    • 如果次数不同,按照字母出现次数从大到小的顺序;
  3. 按照指定个数输出。

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine();
    // 存储每个字符的个数
    Map<Character,Integer> map = new HashMap<>();
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        Integer sum = map.getOrDefault(c, 0);
        map.put(c,++sum);
    }

    /**
     * 统计字符串中各个字母(区分大小写)出现的次数并按照字母出现次数从大到小的顺序。
     * 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
     */
    List<Map.Entry<Character, Integer>> entryList = new ArrayList<>(map.entrySet());
    System.out.println(entryList);
    Collections.sort(entryList, new Comparator<Map.Entry<Character, Integer>>() {
        @Override
        public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
            // 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
            if(o1.getValue().equals(o2.getValue())){
                // 获取字符的ascii码
                return getCharacter(o1.getKey())-getCharacter(o2.getKey());
            }else{
                // 按照字母出现次数从大到小的顺序
                return o2.getValue().compareTo(o1.getValue());
            }
        }
    });

    System.out.println(entryList);
    // 按照指定个数输出
    StringBuilder builder = new StringBuilder();
    for (Map.Entry<Character, Integer> entry : entryList){
        builder.append(entry.getKey()).append(":").append(entry.getValue()).append(";");
    }
    System.out.println(builder);
}

/**
 * 获取字符的ascii码
 *
 * 大写字符+100,保证小写字母在大写字母之前
 */
private static int getCharacter(Character c){
    int ret = 0;
    if(Character.isUpperCase(c)){
        ret = (int)c + 100;
    }else {
        ret = (int)c;
    }
    return ret;
}

java8 Stream简化代码:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine();
    // 存储每个字符的个数
    Map<Character,Integer> map = new HashMap<>();
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        Integer sum = map.getOrDefault(c, 0);
        map.put(c,++sum);
    }

    /**
     * 统计字符串中各个字母(区分大小写)出现的次数并按照字母出现次数从大到小的顺序。
     * 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
     */
    StringBuilder builder = new StringBuilder();
    map.entrySet().stream().sorted(((o1, o2) -> {
        // 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
        if(o1.getValue().equals(o2.getValue())){
            // 获取字符的ascii码
            return getCharacter(o1.getKey())-getCharacter(o2.getKey());
        }else{
            // 按照字母出现次数从大到小的顺序
            return o2.getValue().compareTo(o1.getValue());
        }
    })).forEach(x->builder.append(x.getKey()).append(":").append(x.getValue()).append(";"));

    System.out.println(builder);
}

/**
 * 获取字符的ascii码
 *
 * 故大写字符+100,保证小写字母在大写字母之前
 */
private static int getCharacter(Character c){
    int ret = 0;
    if(Character.isUpperCase(c)){
        ret = (int)c + 100;
    }else {
        ret = (int)c;
    }
    return ret;
}

六、效果展示

1、输入

xyxyXXYYZZZ

2、输出

Z:3;x:2;y:2;X:2;Y:2;

3、说明

  1. 获取每个字符的个数;
  2. 按照字符个数降序排序;
  3. 如果字符个数相同,按照自然顺序进行排序,且小写字母在大写字母之前。

华为OD机试 - 字符统计及重排 - 数据结构list、排序(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,数据结构,七日集训,学习,排序)