1.简述:
描述
给出一个名字,该名字有26个字符组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
本题含有多组数据。
数据范围:输入的名字长度满足 1 \le n \le 10000 \1≤n≤10000
输入描述:
整数N,后续N个名字
输出描述:
每个名称可能的最大漂亮程度
示例1
输入:
2
zhangsan
lisi
复制输出:
192
101
2.代码实现:
思路:
对字符串进行桶排序,我们只需要知道不同字符出现的次数,甚至都不需要知道次数对应的是什么字符;然后再将次数降序排列,依次乘以当前还可以用的最高分值再加入总分值
import java.io.*;
import java.util.*;
public class Main {
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();
}
}