top1编程
← 返回题目
题解

车牌统计

1 条题解

  • 0
    @ 2026-8-5 10:24:13

    解题思路

    每块车牌由 1 个大写字母和 5 个整数组成,虽然字母可能出现在车牌的任何位置,但每块车牌里只有一个大写字母。

    所以我们只需要把每块车牌读进来,在字符串里找出那个大写字母,然后让"这个字母出现的次数"加 1。

    怎么记录每个字母出现几次呢?我们可以开一个大小为 26 的计数数组:

    • cnt[0] 记字母 A 出现的次数;
    • cnt[1] 记字母 B 出现的次数;
    • ......
    • cnt[25] 记字母 Z 出现的次数。

    找到车牌里的大写字母 ch 后,就执行 cnt[ch - 'A']++。

    把所有车牌都处理完之后,在 26 个计数里找出现次数最多的那个。如果两个字母出现次数一样多,题目要求输出 ASCII 码最小的,也就是更靠前的字母(A 比 B 小,B 比 C 小……)。所以我们从 A 开始往后找,只有当前字母的次数严格大于已经找到的最大次数时才更新,次数相等就不更新,这样留下的一定是最靠前(ASCII 码最小)的字母。

    参考代码

    // P4512 车牌统计:统计每块车牌中的大写字母,找出出现次数最多的
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int cnt[26] = {0}; // cnt[i] 记录字母 'A'+i 出现的次数
        char s[20];
        for (int i = 0; i < n; i++) {
            cin >> s;
            // 每块车牌中只有一个大写字母,逐个字符寻找
            for (int j = 0; s[j]; j++) {
                if (s[j] >= 'A' && s[j] <= 'Z') {
                    cnt[s[j] - 'A']++; // 对应字母计数加1
                }
            }
        }
        int best = 0; // 出现次数最多的字母编号
        for (int i = 1; i < 26; i++) {
            // 次数更大的更新;相等时不更新,保留ASCII码小的
            if (cnt[i] > cnt[best]) best = i;
        }
        cout << char('A' + best) << endl;
        return 0;
    }
    

    复杂度分析

    一共有 N 块车牌,每块车牌的长度是固定的 6 个字符,所以总共扫描 O(6×N) 个字符,时间复杂度是 O(N)。计数数组大小固定为 26,空间复杂度是 O(1)。

    • 1