題目描述
給出一個名字,該名字有26個字符串組成,定義這個字符串的「漂亮度」是其全部字母「漂亮度」的總和。
每一個字母都有一個「漂亮度」,範圍在1到26之間。沒有任何兩個字母擁有相同的「漂亮度」。字母忽略大小寫。
給出多個名字,計算每一個名字最大可能的「漂亮度」。
輸入描述
整數N,後續N個名字
N個字符串,每一個表示一個名字
輸出描述
每一個名稱可能的最大漂亮程度
輸入例子
2 zhangsan lisi
輸出例子
192 101
算法實現
import java.util.*;
/**
* All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNext()) {
int n = scanner.nextInt();
List<String> list = new ArrayList<>();
while ((--n) >= 0) {
list.add(scanner.next());
}
System.out.print(count(list));
}
scanner.close();
}
/**
* 計算字符的最大多是漂亮度,計算方式爲對字符串的數字按出現頻率的調到低排序,最高的賦26,下一個賦25,以此類推
*
* @param list
* @return
*/
private static String count(List<String> list) {
StringBuilder builder = new StringBuilder();
for (String s : list) {
int result = 0;
int[] seq = new int[26];
// 統計每一個字母出現的次數,不區分大小寫
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 若是是小寫
if (c >= 'a' && c <= 'z') {
seq[c - 'a']++;
}
// 大寫
else {
seq[c - 'A']++;
}
}
// 按出現的次序從小到大排序
Arrays.sort(seq);
// 計算最大漂亮程度
for (int i = 0; i < seq.length; i++) {
result += seq[i] * (i + 1);
}
builder.append(result).append('\n');
}
return builder.toString();
}
}