@yexiaoqi
2022-05-24T17:06:32.000000Z
字数 920
阅读 456
刷题
华为机试
题目:给出一个只包含字母的字符串,不包含空格,统计字符串中各个子字母(区分大小写)出现的次数,,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数,如果次数相同,按照自然顺序排序,且小写字母在大写字母之前
输入描述:输入一行仅包含字母的字符串
输出描述:按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分割,注意末尾的分号,字母和次数中间用英文冒号分隔
示例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);
}
}
}