题解 | #名字的漂亮度#
名字的漂亮度
https://www.nowcoder.com/practice/02cb8d3597cf416d9f6ae1b9ddc4fde3
import java.util.Scanner;
public class Main {
static char[] chars;//记录出现过的字符
static int[] num;//记录每个字符数目
static int index;//记录当前字符种类数
public static void main(String[] args) {
//获取输入值
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for (int i = 0; i < n; i++) {
String next = in.next();
num = new int[1000];
chars = new char[1000];
index = 0;
for (int j = 0; j < next.length(); j++) {
char c = next.charAt(j);
insert(c);
}
//获取数量的总数
int count = 0;
for (int j = 0; j < num.length; j++) {
if (num[j] == 0) {
count = j;
break;
}
}
//排序
for (int j = 0; j < count; j++) {
for (int k = 0; k < count - j - 1; k++) {
if (num[k] < num[k + 1]) {
int tmp = num[k + 1];
num[k + 1] = num[k];
num[k] = tmp;
}
}
}
//计算结果
int sum = 0;
for (int j = 0; j < count; j++) {
sum += num[j] * (26 - j);
}
System.out.println(sum);
}
}
private static void insert(char c) {
boolean bool = false;
int left = 0;
int right = index - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (c == chars[mid]) {//查找到,存在这个字符
num[mid]++;//查找得到, 该字符数量+1
bool = true;
break;
} else if (c > chars[mid]) {
left = mid + 1;
} else if (c < chars[mid]) {
right = mid - 1;
}
}
//没有查到 插入新的字符
if (!bool) {
if (index == 0) {
chars[0] = c;
num[0] = 1;
index++;
} else {
int i = index - 1;
for (; i >= 0; i--) {
if (chars[i] != 0 && c < chars[i]) {
chars[i + 1] = chars[i];
num[i + 1] = num[i];
chars[i] = 0;
num[i] = 0;
} else {
break;
}
}
chars[i + 1] = c;
num[i + 1] = 1;
index++;
}
}
}
}
解题思路:
1, 先统计出每个字符的数量;
2, 将这些数量按照降序进行排列;
3, 按照最大漂亮度的逻辑进行求和计算
正浩创新EcoFlow公司福利 754人发布