HJ45 - 名字的漂亮度 - 华为
(java实现)
问题
题目描述:
给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。 每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。 给出多个名字,计算每个名字最大可能的“漂亮度”。 本题含有多组数据。
输入描述:
整数N,后续N个名字
输出描述:
每个名称可能的最大漂亮程度
示例1:
输入
2 zhangsan lisi
输出
192 101
问题分析:
首先要理解“最大漂亮度”的值的计算方法;
其原理:字符串中的某个字符出现的频数最高的,其漂亮度为26,其余的依次递减,直到1。
如题目中的“lisi”,“i”出现的频率最高,为2;故其漂亮度为26,“l”和“s”分别为25、24;
计算过程:漂亮度=262+251+24=101.
相关知识:
1、排序函数的使用:Arrays.sort(arr);
注意:要读入的内容包含用整数和字符串的时候,要按行来去读,因为读int的时候,是读取不到换行符的。读取的例子如下:
String line = input.nextLine();
int count = Integer.parseInt(line);
算法实现:
略
参考代码:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNext()) { String line = input.nextLine(); //注意 int count = Integer.parseInt(line); for (int i=0; i<count; i++) { String str = input.nextLine(); char[] ch = str.toCharArray(); int[] arr = new int[27]; int sum = 0, in=0; for (int j=0; j<ch.length; j++) { in = ch[j]-'a'+1; arr[in]++; //统计 } Arrays.sort(arr); //按频率大小来排序,频率越高,漂亮度越高 for (int j=1; j<27; j++) { sum = sum + j*arr[j]; } System.out.println(sum); } } } }