【华为OJ】【算法总篇章】
【华为OJ】【033-名字的漂亮度】
【工程下载】
题目描述
给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
输入描述
整数N,后续N个名字
N个字符串,每个表示一个名字
输出描述
每个名称可能的最大漂亮程度
输入例子
2 zhangsan lisi
输出例子
192 101
算法实现
import java.util.*;
/**
* Author: 王俊超
* Date: 2015-12-24 15:26
* 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();
}
}
时间: 2024-12-20 23:15:42