统计字符数

GitHub跳转原题关系图返回列表

统计 26 个小写字母的出现次数,再从 'a' 到 'z' 依次取严格更大者,即可得到次数最多且 ASCII 最小的字符。

OJ: roj

题目 ID: 1187

难度:入门

标签:字符串计数

创建: 2026-09-29 22:40

更新: 2026-10-05 04:41

题目描述

输入一行由 26 个小写字母组成的字符串 SS,∣S∣⩽1000|S| \leqslant 1000。输出 SS 中出现次数最多的字符及次数,中间用一个空格分隔;若有多个字符次数并列最多,输出 ASCII 码最小的那个。样例输入 abbccc,期望输出 c 3。

思路

字符集只有 26 个小写字母,用大小为 26 的数组一次扫描统计每个字母的频次;随后从 a 到 z 顺序扫描,只在频次严格更大时更新答案,这样并列最大时会自然保留 ASCII 码最小的字符。时间复杂度 O(∣S∣)O(|S|)。

参考代码

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;
}