翻译
将 语言转为
改为 只要将 中的大写字母前加下划线,及将大写字母改为小写。
改为 将 的下划线去掉,将下划线后的字母改为大写。
如果输出 :
首字母大写,下划线,有 个下划线同时,末尾出现下划线
没有下划线, 没有大写字母。
思路
这道题非法情况特多,可以先检测所有的非法情况,然后放心处理即可。对于里面那些恶心的操作,我竟然第一个就想到了 ,里面有个坑,那就是如果你不 与 放在一起的话, 不会成功(因为你刚转完又被 判断到然后覆盖了)。为此我样例都没过,然后解决了一次提交,过了!!!(加了许多的玄学优化)。
然后得到了:
全班程序最短
全班做法最特殊(只有我一个用 ,貌似在网上还没看见这么做的)
全班唯一二个提交一次就 了
全班运行第二快, (%%%第一卡常dalao)
Code
#include<iostream>
#include<vector>
#include<cstdlib>
#include<cstring>
using namespace std;
vector<char>s;//vector大法好
int upper=0,under=0;
inline void Error()
{
cout<<"Error!"<<endl;
exit(0);
}
inline void first()
{
for(register int i=1; i<s.size(); ++i)
{
if(s[i]=='_')
{
if(s[i-1]=='_')//连续_
Error();
else
under++;
}
if(isupper(s[i]))
upper++;
}
if(upper&&under)//Java与C++冲突
Error();
if(isupper(s[0])||s[0]=='_'||s[s.size()-1]=='_')//开头结尾的问题
Error();
}
int main()
{
ios::sync_with_stdio(false);
char c;
while(cin>>c)
s.push_back(c);//输入
first();//查找错误情况
for(register int i=1; i<s.size(); ++i)//放心处理
if(s[i]=='_')
{
s.erase(s.begin()+i);
s[i]=toupper(s[i]);
}
else if(isupper(s[i])&&upper)//枚举大写更快,upper是特判,如果出现了大写说明是Java
{
s[i]=tolower(s[i]);
s.insert(s.begin()+i,'_');
}
for(register int i=0; i<s.size(); i++)//输出
cout<<s[i];
return 0;
}