从字符串中,提取相应字符出现的个数,并且计算重要度。\n 如:aabbccdef,字符已经出现的个数分别是: a - 2,b - 2, c - 2, d - 1,e - 1,f - 1\n 上面只是一个距离,序列是要根据出现的个数进行排序的,所以对应的漂亮度:26,25,。。。。\n 然后计算最终结果:2 * 26 + 2 * 25 + 2 * 24 + 23 * 1 + 22 * 1 + 21 * 1\n
- 输入目标串,转换成小写,然后遍历,逐一添加到HashSet,如果hashSet.add()返回的是true,也就是能够添加,这个时候添加到Map集合中,Map集合存储的是对应的字符和出现的个数。如果返回的是false,那么就将map集合中的字符出现的个数+1\n
- 遍历map集合,将得到的字符出现的个数添加到list集合中去\n
- 重写list.sort的排序规则\n
- 遍历list集合并且计算漂亮度的结果即可。\n
import javax.swing.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
// 名字的漂亮度,一个串中,出现最多次数的字母,漂亮度为26,次数相同,则随机分配,如a,b出现两次,则25,24
Scanner sc = new Scanner(System.in);
// System.out.println((int)'a');
// 输入一个整数N,后续N个名字
while(sc.hasNext()){
int numbers = sc.nextInt();
int sum = 0;// 存放漂亮度
// 使用list集合来保存即可,下标就是字母对应的1-26,然后值是出现的次数。
Map<Character,Integer> map = new HashMap<>();// 保证插入次序
String s2 = sc.nextLine();// 接收后面的那个换行
// 存放输入的串
List<String> list = new ArrayList<>();
for(int i = 1; i <= numbers; i++) {
HashSet<Character> hs = new HashSet<>();
StringBuffer bf = new StringBuffer(sc.nextLine().toLowerCase());// 用来保存输入的目标串
for (int j = 0; j < bf.length(); j++) {
// 写入map集合,value是对应的次数
if (hs.add(bf.charAt(j))) // 如果hashSet能加入成功,就说明在map中还没有
map.put(bf.charAt(j), 1);
else // 原来有
map.put(bf.charAt(j), map.get(bf.charAt(j)) + 1);
}
// 计算漂亮度,每次都找到最大的
int finalSum = 0;
int max = -1;
int chushi = 26;
List<Integer> listRes = new ArrayList<>();
for (Character c : map.keySet()) {
listRes.add(map.get(c));// 把出现的权重值加入到list集合里面去
}
// 给list集合设置排序规则
listRes.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for(int k = 0; k < listRes.size();k++) {
finalSum += listRes.get(k) * (chushi - k );// 计算结果
}
System.out.println(finalSum);
map.clear();
}
}
}
}