题解 | #名字的漂亮度#

名字的漂亮度

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, 按照最大漂亮度的逻辑进行求和计算

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务