北京师范大学第十六届程序设计竞赛决赛-重现赛-G-命名规范问题

题目描述 

驼峰命名法是起变量名的一种规范,大致来说是用混合的大小写字母来构成变量名,在这个问题里你可以假设具体规则如下:

1.每个变量名由至少2个单词拼接构成,且每个单词长度至少为2;

2.每个单词的首字母必须大写,其他位置必须小写(除了变量名的第一个单词允许全部小写外)。

 

但是SK同学的英语很差,看到长长的变量名就很难脑补出是由哪些单词组成的,因此看驼峰命名法的代码十分头疼。

还有一种下划线命名法,规则比较简单,即各个单词之间用下划线'_'连接,且字母全部小写。

现在给你一些变量名,你能将其中符合驼峰命名法规范的变量转换成下划线命名法吗?

输入描述:

第一行是一个正整数T(≤ 20000),表示测试数据的组数,
每组测试数据只有一行,包含一个仅包含大小写英文字母且长度不超过20的变量名,
保证所有测试数据变量名长度总和不超过200000。

输出描述:

对于每组测试数据,输出一行,包含一个字符串,如果变量名符合驼峰命名法规范则将其改为下划线命名法,否则不变。
示例1

输入

10
mystring
myString
String
SS
my
mySString
mString
STRING
StrinG
IndexOfString

输出

mystring
my_string
String
SS
my
mySString
mString
STRING
StrinG
index_of_string

坑点:第二个字母不能是大写字母。。。

思路:第二个和最后一个英文字母不能是大写,不能有两个连续的大写字母,不能全是小写字母,其余的直接转换即可。

ACDAIMA:

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

int main() {
    int t;
    cin >> t;
    string s;
    while(t--)
    {
        cin >> s;
        bool flag = true;
        int index = 0, ans = 1, len = s.length();
        for(int i = 1; i < len; i ++)
        {
            //第二个和最后一个英文字母不能是大写,不能有两个连续的大写字母,不能全是小写字母
            if(s[i] >= 'A' && s[i] <= 'Z' && i == index + 1) 
            {
                flag = false;
                break;
            }
            else if(s[i] >= 'A' && s[i] <= 'Z') index = i, ans++;
        }
        if(ans == 1||!flag || (index == len-1)) cout << s << endl;
        else
        {
            for(int i = 0; i < len; i ++)
            {
                if(s[i] >= 'A' && s[i] <= 'Z' && i != 0)
                {
                    printf("_%c",s[i]+32);
                }
                else if(s[i] >= 'A' && s[i] <= 'Z' && i == 0)
                {
                    printf("%c",s[i]+32);
                }
                else cout << s[i];
            }
            cout << endl;
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/80163625