统计 26 个小写字母的出现次数,再从 'a' 到 'z' 依次取严格更大者,即可得到次数最多且 ASCII 最小的字符。
OJ: roj
题目 ID: 1187
难度:入门
标签:字符串计数
创建: 2026-09-29 22:40
更新: 2026-10-05 04:41
题目描述
输入一行由 26 个小写字母组成的字符串 abbccc,期望输出 c 3。
思路
字符集只有 26 个小写字母,用大小为 26 的数组一次扫描统计每个字母的频次;随后从 a 到 z 顺序扫描,只在频次严格更大时更新答案,这样并列最大时会自然保留 ASCII 码最小的字符。时间复杂度
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 22:40
# update_at: 2026-10-04 14:35
import sys
from collections import Counter
def solve() -> None:
"""读入字符串,统计 26 个小写字母出现次数,输出次数最多且 ASCII 最小的字符。"""
data = iter(sys.stdin.buffer.read().split())
s = next(data).decode()
cnt = Counter(s)
# 按出现次数降序、ASCII 升序选出答案字符:max 在次数相同时取 -ord 更大者,即 ASCII 更小者
ch: str = max(cnt, key=lambda c: (cnt[c], -ord(c)))
print(ch, cnt[ch])
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 04:41
* update_at: 2026-10-05 04:41
*/
#include <cstdio>
typedef long long ll;
const int ALPHA = 26; // 小写字母 a-z 的字符集大小
int cnt[ALPHA]; // cnt[i] 表示字母 ('a' + i) 在字符串中出现的次数
char s[1005]; // 输入字符串,长度不超过 1000
int main() {
scanf("%s", s);
for (int i = 0; s[i] != '\0'; i++) {
cnt[s[i] - 'a']++;
}
// 从 'a' 到 'z' 依次比较,只在次数严格更大时更新,
// 这样并列最大时会保留 ASCII 码最小的字符。
int answer = 0;
for (int i = 1; i < ALPHA; i++) {
if (cnt[i] > cnt[answer]) {
answer = i;
}
}
printf("%c %d\n", 'a' + answer, cnt[answer]);
return 0;
}