其实呢对我来说这是一道很的水题了, 今天用C++ 的string类型写的时候一直提交不对,也没发现那里有错误,本以为又是玄学错误呢。(有次积分赛出现超级玄学问题, 一直觉得代码没错误,前前后后提交了20几遍,全给我返回的是wrong, 赛后向学长反应时,学长看了一下我的代码,以及输出结果,我靠,居然输出了一个乱码。那么问题来了,我在本地运行的时候是完全没问题的。还是最后会长说了句可能是从pdf上复制输出格式的时候出问题了。到最后这道题也没给我按对,没办法,会长说了一切以pc2判断为主。)言归正传,就去看看了以前写的代码,一看觉得也没问题啊,突然灵光一闪发现是循环终止条件上的问题。
之前是这样写的,提交返回错误
int len = str.size();
for( int i=0; i<len; i++ )
改了之后是这样, 就对了
for( int i=0; i<str.size(); i++ )
其实很对,因为在循环过程中我们有erase的操作,这样str.size()与之前的len就不相等了。
题目:
小Hi写程序时习惯用蛇形命名法(snake case)为变量起名字,即用下划线将单词连接起来,例如:file_name、 line_number。
小Ho写程序时习惯用驼峰命名法(camel case)为变量起名字,即第一个单词首字母小写,后面单词首字母大写,例如:fileName、lineNumber。
为了风格统一,他们决定邀请公正的第三方来编写一个转换程序,可以把一种命名法的变量名转换为另一种命名法的变量名。
你能帮助他们解决这一难题吗?
Input
第一行包含一个整数N,表示测试数据的组数。(1 <= N <= 10)
以下N行每行包含一个以某种命名法命名的变量名,长度不超过100。
输入保证组成变量名的单词只包含小写字母。
Output
对于每组数据,输出使用另一种命名法时对应的变量名。
Sample Input
2
file_name
lineNumber
Sample Output
fileName
line_number
string写法:
#include <bits/stdc++.h>
using namespace std;
string str;
int main()
{
int t;
scanf("%d", &t);
while( t-- )
{
str.clear();
cin >> str;
int len = str.size();
for( int i=0; i<str.size(); i++ )
{
if( str[i] == '_' )
{
str.erase(str.begin() + i);
str[i] = str[i] - ( 'a' - 'A' );
}
else if( str[i] >= 'A' && str[i] <= 'Z' )
{
str[i] = str[i] + ( 'a' - 'A' );
str.insert(str.begin() + i, '_');
}
}
cout << str << endl;
}
return 0;
}
vector写法:
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
vector<char> name;
char str;
int t, i, j;
scanf("%d", &t );
getchar();
while( t-- ){
while( ( str = getchar() ) != '\n' ){
name.push_back( str );
}
for( i=0; i<name.size(); i++ ){
if( name[i] == '_' ){
name[i+1] = name[i+1] - ( 'a' - 'A' );
name.erase( name.begin() + i );
//break;
}
else if( name[i] >= 'A' && name[i] <= 'Z' ){
name.insert( name.begin()+i, '_' );
name[i+1] = name[i+1] + ( 'a' - 'A' );
//break;
}
}
for( i=0; i<name.size(); i++ )
printf("%c", name[i] );
printf("\n");
name.clear();
}
return 0;
}