1. 题目
读题
考查点
2. 解法
思路
代码逻辑
具体实现
首先,我们需要定义一个方法来计算一个字符串的漂亮度。漂亮度是指字符串中每个字母出现的次数乘以它在字母表中的位置,然后求和。例如,字符串"ABC"的漂亮度是11 + 22 + 3*3 = 14。
我们可以用一个数组来存储每个字母出现的次数,然后用一个循环来遍历字符串,更新数组。然后,我们再用一个循环来计算漂亮度,根据字母的位置加上相应的值。
代码如下:
//定义一个方法,参数是字符串,返回值是漂亮度
public static int beauty(String s) {
//定义一个长度为26的数组,存储每个字母出现的次数
int[] count = new int[26];
//将字符串转换为大写,方便处理
s = s.toUpperCase();
//遍历字符串,更新数组
for (int i = 0; i < s.length(); i++) {
//获取当前字符
char c = s.charAt(i);
//如果是字母,就在对应的位置加一
if (c >= 'A' && c <= 'Z') {
count[c - 'A']++;
}
}
//定义一个变量,存储漂亮度
int beauty = 0;
//遍历数组,计算漂亮度
for (int i = 0; i < count.length; i++) {
//如果当前字母出现了,就加上它的位置乘以次数
if (count[i] > 0) {
beauty += (i + 1) * count[i];
}
}
//返回漂亮度
return beauty;
}
然后,我们可以调用这个方法,传入"HJ45"作为参数,打印出结果:
public static void main(String[] args) {
//调用方法,传入"HJ45"
int result = beauty("HJ45");
//打印结果
System.out.println(result);
}
运行这段代码,输出是:
98
自行实现
public class HJ045 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String[] names = new String[n];
for (int i = 0; i < n; i++) {
names[i] = sc.nextLine();
}
calGrade(names);
}
public static int[] calGrade(String[] names) {
int n = names.length;
int[] grades = new int[n];
for (int i = 0; i < n; i++) {
grades[i] = calGrade(names[i]);
System.out.println(grades[i]);
}
return grades;
}
public static int calGrade(String name) {
name = name.toLowerCase();
int[] fre = new int[26];
for (char c : name.toCharArray()) {
fre[c - 'a'] += 1;
}
Arrays.sort(fre);
int grade = 0;
int initial = 26;
for (int i = 25; i >=0; i--) {
if (fre[i] == 0) {
break;
}
grade += initial * fre[i];
initial--;
}
return grade;
}
}