题解
车牌统计
1 条题解
-
0
解题思路
每块车牌由 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