1 条题解

  • 0
    @ 2026-6-19 10:30:54

    📝 题目大意

    给定一个长度为奇数的字符串 SS(仅含大小写英文字母),统计其中大写字母和小写字母的个数。若大写字母更多,则将整个字符串转为大写;否则转为小写。输出转换后的字符串。

    💡 解题思路

    1. 题目分析:题目保证 SS 的长度为奇数(1S991 \leq |S| \leq 99),因此大写字母和小写字母的个数不可能相等,必然存在严格的大小关系。这意味着我们不需要处理"相等"的边界情况,只需比较大小即可。

    2. 算法推导:遍历字符串 SS,用 isupper(c) 判断每个字符是否为大写,分别统计大写字母个数 upper 和小写字母个数 lower。比较 upperlower:若 upper > lower,则用 toupper(c) 将整个字符串逐字符转为大写;否则,用 tolower(c) 将整个字符串逐字符转为小写。最后直接输出。

    3. 边界与细节:由于长度保证为奇数,不存在 upper == lower 的情况,无需额外判断。使用 C++ 的 <cctype> 中的 isuppertouppertolower 函数可简洁处理大小写判断与转换,注意这些函数对非字母字符的行为,但本题保证只含字母,无需担心。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),其中 N=SN = |S|。第一遍遍历统计大小写个数,第二遍遍历进行转换,总共两次线性扫描。
    • 空间复杂度O(N)O(N),存储输入字符串 SS

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main() {
        string S;
        cin >> S;
        // 统计大写字母和小写字母的个数
        int upper = 0, lower = 0;
        for (char c : S) {
            if (isupper(c)) upper++;
            else lower++;
        }
        // 根据大小写个数决定转换方向
        if (upper > lower) {
            // 大写字母更多,全部转为大写
            for (char &c : S) c = toupper(c);
        } else {
            // 否则全部转为小写
            for (char &c : S) c = tolower(c);
        }
        cout << S << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    804
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者