题解
本地可以借助计数排序的思维,进行剖析;本题的解题思路是:
1.将所有的字符按照出现的次数进行排序。
2.将排序后的字符数组按照最大 “漂亮度” 26依次递减。
例如:zhangsan ==》 aa nn z h g s ==> a(26) + a(26) + n(25) + n(25) + z(24) + h(23) + g(22) + s(21) = 192
代码
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 1.输入内容
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] names = new String[n];
int index = 0;
while(n-- > 0) {
names[index++] = sc.next().toLowerCase();
}
// 2.遍历处理字符串数组
for(int i=0; i<names.length; i++) {
cal(names[i]);
}
}
public static void cal(String name) {
// 2.1 统计字符串出现的次数
char[] chars = name.toCharArray();
// 字符串 a-z 的 ASCII 码 范围: [97 - 122]
int[] charNum = new int[123]; // 存放出现字符的长度,定义数组长度为123,因为索引值包括122
for(int i=0; i<chars.length; i++) {
charNum[chars[i]]++;
}
// 2.2 升序排序
Arrays.sort(charNum);
int sum=0; // 存放总和
int maxPer = 26; // 最大漂亮度
for(int i=122; i >= 0; i--) {
// 2.3 计算漂亮度
if(charNum[i] >= 1){
// sum累加,依次递减的漂亮度 * 依次递减字符重复的次数
sum += maxPer-- * charNum[i];
}
// 2.4 如果已经遍历到0了,证明下面没有字符了,直接打印退出
if(charNum[i] == 0) {
System.out.println(sum);
break;
}
}
}
}