[关闭]
@yexiaoqi 2022-05-24T09:06:32.000000Z 字数 920 阅读 342

统计字符出现的次数

刷题 华为机试


题目:给出一个只包含字母的字符串,不包含空格,统计字符串中各个子字母(区分大小写)出现的次数,,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数,如果次数相同,按照自然顺序排序,且小写字母在大写字母之前

输入描述:输入一行仅包含字母的字符串
输出描述:按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分割,注意末尾的分号,字母和次数中间用英文冒号分隔

示例1

输入:xyxyXX
输出:x:2;y:2;X:2;
说明:每个字符出现的次数为2 故x排在y之前,而小写字母x在大写X之前

示例2

输入:abababb
输出:b:4;a:3;
说明:b的出现个数比a多,故排在a前

  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3. public class Main{
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. while(sc.hasNext()){
  7. String s = sc.next();
  8. Map<Character, Integer> map = new HashMap<>();
  9. for (int i=0; i<s.length(); i++){
  10. char c = s.charAt(i);
  11. map.put(c, map.getOrDefault(c,0)+1);
  12. }
  13. String collect = map.entrySet().stream()
  14. .sorted((e1, e2) -> {
  15. int k1 = e1.getKey();
  16. int k2 = e2.getKey();
  17. int v1 = e1.getValue();
  18. int v2 = e2.getValue();
  19. //小写字母在大写字母之前,或者先将小写和大写的分开,各自排序后组合,思路清晰,比较好写
  20. return v1==v2 ? (k1>='a'&&k2<='Z' ? -1 : 1) : 0;
  21. })
  22. .map(e -> e.getKey() + ":" + e.getValue() + ";")
  23. .collect(Collectors.joining());
  24. System.out.println(collect);
  25. }
  26. }
  27. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注