题解:学而思编程 驼峰与蛇

【题目来源】

学而思编程:驼峰与蛇

【题目描述】

编程中有两种对变量命名常用的方法:

①驼峰命名法——变量名中第一个单词之外,其他单词首字母大写,单词之间不加空格或者其他字符,直接拼接。比如 myFirstName,dataCenter 等。

②蛇形命名法——变量名中出现的单词字母全部小写,单词之间用一个下划线 _ 相连,比如 my_first_name,data_center 等。

现在给定你 \(n\) 个变量名,其中 \(a\) 个变量名用驼峰法命名和 \(b\) 个变量名用蛇形法命名,保证 \(a+b = n\)。请你将驼峰法命名的变量名转成蛇形法命名的变量名,蛇形法命名的变量名转成驼峰法命名的变量名。

【输入】

第一行一个正整数 \(n\)

第二行到第 \(n+1\) 行每行一个字符串 \(s\),表示使用驼峰法或蛇形法命名的变量名。

【输出】

\(n\) 行,每行一个字符串表示转换之后的新的变量名。

【输入样例】

2
myFirstName
data_center

【输出样例】

my_first_name
dataCenter

【核心思想】

  1. 问题分析:给定 \(n\) 个变量名,每个变量名要么是驼峰命名法(如 myFirstName),要么是蛇形命名法(如 data_center)。需要将驼峰法转成蛇形法,蛇形法转成驼峰法。这是一个字符串遍历 + 字符分类处理问题,关键在于根据当前字符的大小写或下划线判断命名法类型并执行对应转换。

  2. 算法选择

    • 逐字符扫描:遍历字符串每个字符,根据字符类型(小写/大写/下划线)决定输出
    • 驼峰转蛇形:遇到大写字母时,先输出下划线再输出其小写形式
    • 蛇形转驼峰:遇到下划线时,跳过下划线并输出下一个字符的大写形式
  3. 关键步骤

    • 初始化:读取 \(n\)(变量名数量)
    • 处理每个变量名
      • 读取字符串 \(s\)
      • 遍历 \(i\)\(0\)s.size() - 1
        • s[i] 是小写字母('a' <= s[i] <= 'z'):直接输出 s[i]
        • s[i] 是大写字母('A' <= s[i] <= 'Z'):输出 "_" + char(s[i] + 32)(下划线加小写形式)
        • 否则(s[i] 是下划线):输出 char(s[i+1] - 32)(下一个字符的大写形式),然后 i++ 跳过下一个字符
      • 输出换行
    • 重复处理 \(n\) 个变量名
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\sum |s_i|)\),与所有字符串总长度成正比
    • 空间复杂度:\(O(\max |s_i|)\),仅需存储当前处理的字符串
  5. 字符分类处理的核心思想

    • 自动识别命名法:无需预先判断变量名是驼峰还是蛇形,通过字符特征自动区分。驼峰法含大写字母,蛇形法含下划线,两者不会同时出现(题目保证)
    • 状态无关转换:每个字符的处理仅依赖当前字符(及蛇形时的下一个字符),无跨字符状态传递,适合逐字符流式处理
    • ASCII 码运算:利用大小写字母 ASCII 码差值为 \(32\) 的特性,+32 转小写,-32 转大写,避免查表或函数调用
    • 下划线联动处理:蛇形转驼峰时,下划线与后一个字符构成一个逻辑单元,跳过下划线并将后一个字符大写,保持索引同步
    • 适用于"命名法互转"类字符串处理问题,逐字符分类处理简洁高效,无需复杂的状态机或正则表达式

【算法标签】

字符串入门

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t;  // 测试用例数量
    cin >> t;

    while (t--)  // 处理每个测试用例
    {
        string s;
        cin >> s;  // 输入字符串

        for (int i = 0; i < s.size(); i++)  // 遍历字符串
        {
            if ('a' <= s[i] && s[i] <= 'z')  // 如果是小写字母
            {
                cout << s[i];  // 直接输出
            }
            else if ('A' <= s[i] && s[i] <= 'Z')  // 如果是大写字母
            {
                cout << "_" << char(s[i] + 32);  // 输出下划线+小写字母
            }
            else  // 其他情况(应该是下划线)
            {
                cout << char(s[i + 1] - 32);  // 输出下一个字符的大写形式
                i++;  // 跳过下划线后面的小写字母
            }
        }

        cout << endl;  // 每个测试用例后换行
    }

    return 0;
}

【运行结果】

2
myFirstName
my_first_name
data_center
dataCenter
posted @ 2026-07-04 14:54  团爸讲算法  阅读(4)  评论(0)    收藏  举报