@yexiaoqi
2022-05-24T09:06:32.000000Z
字数 920
阅读 698
刷题 华为机试
题目:给出一个只包含字母的字符串,不包含空格,统计字符串中各个子字母(区分大小写)出现的次数,,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数,如果次数相同,按照自然顺序排序,且小写字母在大写字母之前
输入描述:输入一行仅包含字母的字符串
输出描述:按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分割,注意末尾的分号,字母和次数中间用英文冒号分隔
示例1:
输入:xyxyXX
输出:x:2;y:2;X:2;
说明:每个字符出现的次数为2 故x排在y之前,而小写字母x在大写X之前
示例2:
输入:abababb
输出:b:4;a:3;
说明:b的出现个数比a多,故排在a前
import java.util.*;import java.util.stream.Collectors;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){String s = sc.next();Map<Character, Integer> map = new HashMap<>();for (int i=0; i<s.length(); i++){char c = s.charAt(i);map.put(c, map.getOrDefault(c,0)+1);}String collect = map.entrySet().stream().sorted((e1, e2) -> {int k1 = e1.getKey();int k2 = e2.getKey();int v1 = e1.getValue();int v2 = e2.getValue();//小写字母在大写字母之前,或者先将小写和大写的分开,各自排序后组合,思路清晰,比较好写return v1==v2 ? (k1>='a'&&k2<='Z' ? -1 : 1) : 0;}).map(e -> e.getKey() + ":" + e.getValue() + ";").collect(Collectors.joining());System.out.println(collect);}}}
