题解 | #名字的漂亮度#
名字的漂亮度
http://www.nowcoder.com/practice/02cb8d3597cf416d9f6ae1b9ddc4fde3
Java解法
基本思路
- 使用map将字符和它的出现次数对应起来
- 再将values全部取出形成单独的list,进行倒序排序
- 从26开始递减,相乘即可
一些要注意的操作
-
实现对于已存在的Key,直接将它原本的key加一
map.put(c,map.get(c)+1);
-
map的values直接取出是Collection类型,直接强转成list会出错,可以采用如下方法:
List<Integer> list = new ArrayList<>(map.values());
-
对List进行升序排序可使用Collections,倒序排序再reverse一下即可
Collections.sort(list); //升序 Collections.reverse(list); //倒序需要再加这一句
-
对数组进行排序使用Arrays,而不是Collections
int[] a = new int[5]; Arrays.sort(a); //升序
-
字符进行变换大小写的操作时,要通过Character,但注意不是直接就改变了,而是作为返回值返回了
Character.toLowerCase(c); //这句话执行后,c还是原来的c c = Character.toLowerCase(c); //必须接收返回值,并赋值给c,才可以改变c
题解
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=0;i<n;i++){
String s = in.next();
char[] cs = s.toCharArray();
Map<Character,Integer> map = new HashMap<>();
for(char c:cs){
if(!map.containsKey(c)){
map.put(c,1);
}else{
map.put(c,map.get(c)+1);
}
}
List<Integer> list = new ArrayList<>(map.values());
Collections.sort(list);
Collections.reverse(list);
//System.out.println(list);
int sum=0;
for(int j=26,k=0;j>=1&&k<list.size();j--,k++){
sum += j*(list.get(k));
}
System.out.println(sum);
}
}
}