华为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; |
本题比较简单,就是逻辑分析,按照题意解题即可。
按照字母出现次数从大到小的顺序,如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
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;
}
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;
}
xyxyXXYYZZZ
Z:3;x:2;y:2;X:2;Y:2;
下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。