题解

本地可以借助计数排序的思维,进行剖析;本题的解题思路是:

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;
            }
        }
    }
}