一、题目描述
给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个字符串,计算每个字符串最大可能的“漂亮度”。
本题含有多组数据。
数据范围:输入的名字长度满足 1≤n≤10000
。
二、输入描述
第一行一个整数N,接下来N行每行一个字符串。
三、输出描述
每个字符串可能的最大漂亮程度。
四、解题思路
- 读取输入的整数 N,表示有多少个字符串;
- 使用循环读取每个字符串,并进行处理:
- 初始化一个长度为26的数组 counter,用于记录每个字母出现的次数;
- 遍历当前字符串的每个字符 c,将其对应的计数器加1;
- 创建一个动态数组 list,用于存储所有非零计数器的值;
- 将计数器数组中大于0的值加入 list 中;
- 对 list 进行降序排序,确保出现次数多的字母在前面;
- 初始化变量 point 为26,用于表示字母的漂亮度;
- 初始化变量 sum 为0,用于累计最大可能的漂亮度;
- 遍历 list,计算每个字母的漂亮度并累加到 sum 中;漂亮度计算方式为 (point - i) * list.get(i),其中 i 为当前字母在 list 中的索引;
- 输出最大可能的漂亮度 sum;
- 循环结束后,所有字符串的最大可能漂亮度计算完成;
五、Java算法源码
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
while ((s = br.readLine()) != null) {
int[] counter = new int[26];
for(char c: s.toCharArray()) {
counter[c-'a']++;
}
List<Integer> list = new ArrayList<>();
for(int n: counter) {
if (n > 0) {
list.add(n);
}
}
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return i2.intValue() - i1.intValue();
}
});
int point = 26, sum = 0;
for(int i = 0; i < list.size(); i++) {
sum += (point - i) * list.get(i).intValue();
}
System.out.println(sum);
}
br.close();
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。