官方描述:
给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
题目理解:
就是说输入N个字母组成的字符串数组,每个元素都有一个最大可能的“漂亮度”,这里的最大可能,我们需要斟酌一下。大概意思就是这样的,我们使每个元素里面出现次数最多的字母所代表的数字26,次数降低,数字依次降低。
再简单点,就是把每个忽略字母大小写的字符串进行字母频率统计,频率最高的代表26,并且依次减小。
还有几点华为OJ的规则需要注意:
- 类名必须是Main
- 最好添加一个private修饰的Main构造器
接下来就是直接上代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Main {
private Main() {//私有构造器,由华为编译反馈添加的,不知道原因
}
public static void main(String args[]) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
String[] names=new String[N];
for (int i = 0; i < N; i++) {
names[i]=scanner.next();
System.out.println(maxBeauty(names[i]));
}
scanner.close();
}
//传入一个字符串,返回这个字符串的最大可能漂亮度
public static int maxBeauty(String name) {
// 字母为key,出现的次数为值
Map<Character, Integer> map = new
HashMap<Character, Integer>();
//使用for循环和是否包含进行频率统计
for (int i = 0; i < c.length; i++) {
if (map.containsKey(c[i])) {
map.put(c[i], map.get(c[i]) + 1);
} else {
map.put(c[i], 1);
}
}
List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet());
//重写sort方法,定义自己的降序排序
Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());// 降序排列
}
});
int result = 0;
for (int i = 0; i < list.size(); i++) {
result = result + list.get(i).getValue() * (26 - i);
}
return result;
}
}
自此,这个题目也算是完成了。
知识点在于:
集合里面的key-value完成频率统计;
然后使用sort方法排序;
然后,就没有了。