法官在 cAPS lock 中说错了答案
The judge said wrong answer in cAPS lOCK
各位。在 Codeforces 的问题 cAPS lOCK 中,法官对测试用例 3 的回答是错误的,即 'cAPSlOCK'。现在,通过阅读问题和给出的以下条件:
“让我们假设在意外打开大写锁定键的情况下键入了一个单词,如果:
a) 要么只包含大写字母;要么b) 或除第一个字母外的所有字母均为大写。"
考虑到上述情况,'cAPSlOCK'应该改为'CapsLock',因为除了'c'不是所有的单词都是小写的,即'l'。
#include <iostream>
#include<string>
#include <iterator>
using namespace std;
int main()
{
string str;
cin>>str;
int count(0);
int len = str.length();
bool flag = true;
char first{str[0]};
if(isupper(first))
{
for(int i = 1; i<len; i++)
{
if(islower(str[i]))
{
count++;
}
}
}
count = count;
if (count == len - 1){flag = false;}
count = 0;
if(len = 1 && islower(first)){flag = true;}
while(flag)
{
for(auto& i : str)
{
if(isupper(i))
{
i = tolower(i);
}
else if (islower(i))
{
i = toupper(i);
}
}
break;
}
cout<<str<<endl;
}
因此,我的代码将 'cAPSlOCK' 转换为 'CapsLock',但所需的答案是 'cAPSlOCK'
非常感谢任何人在这里的意见。
您真的应该使用调试器来查看代码的作用。使用调试器,您将看到输入 cAPSlOCK
您的代码...
初始化
bool flag = true;
检查第一个字符是否为大写(不是)
if(isupper(first))
检查 count
是否等于字符数 -1(计数仍然是 0
)
if (count == len - 1){flag = false;}
然后使用了有拼写错误的条件
if(len = 1 && islower(first)){flag = true;}
len = 1
是赋值而不是比较。应该有一个编译器警告。不要忽略编译器警告!但是,即使修复该条件也不会改变最终结果,因为无论如何 flag
仍然是 true
。
最终它将大写字母转换为小写字母,将小写字母转换为大写字母:
while(flag)
....
你的逻辑是错误的。当条件说:
a) either it only contains uppercase letters; b) or all letters except for the first one are uppercase.
那么你应该只在这些条件适用时才转换字符。您不应该从 flag = true
开始,然后检查条件。
如果您使用函数,您的代码将更具可读性。我建议为每个条件编写两个函数:
bool only_uppercase_letters(const std::string& input) {
//...
}
bool first_lower_and_all_others_upper_case(const std::string& input) {
//..
}
还有第三个转换字母的函数:
void transform_letters(std::string& input) {
// ...
}
那么main
可以简单很多:
int main() {
std::string inp;
std::cin >> inp;
if (only_uppercase_letters(inp) || first_lower_and_all_others_upper_case(inp)) {
transform_letters(inp);
}
std::cout << inp;
}
各位。在 Codeforces 的问题 cAPS lOCK 中,法官对测试用例 3 的回答是错误的,即 'cAPSlOCK'。现在,通过阅读问题和给出的以下条件:
“让我们假设在意外打开大写锁定键的情况下键入了一个单词,如果:
a) 要么只包含大写字母;要么b) 或除第一个字母外的所有字母均为大写。"
考虑到上述情况,'cAPSlOCK'应该改为'CapsLock',因为除了'c'不是所有的单词都是小写的,即'l'。
#include <iostream>
#include<string>
#include <iterator>
using namespace std;
int main()
{
string str;
cin>>str;
int count(0);
int len = str.length();
bool flag = true;
char first{str[0]};
if(isupper(first))
{
for(int i = 1; i<len; i++)
{
if(islower(str[i]))
{
count++;
}
}
}
count = count;
if (count == len - 1){flag = false;}
count = 0;
if(len = 1 && islower(first)){flag = true;}
while(flag)
{
for(auto& i : str)
{
if(isupper(i))
{
i = tolower(i);
}
else if (islower(i))
{
i = toupper(i);
}
}
break;
}
cout<<str<<endl;
}
因此,我的代码将 'cAPSlOCK' 转换为 'CapsLock',但所需的答案是 'cAPSlOCK'
非常感谢任何人在这里的意见。
您真的应该使用调试器来查看代码的作用。使用调试器,您将看到输入 cAPSlOCK
您的代码...
初始化
bool flag = true;
检查第一个字符是否为大写(不是)
if(isupper(first))
检查 count
是否等于字符数 -1(计数仍然是 0
)
if (count == len - 1){flag = false;}
然后使用了有拼写错误的条件
if(len = 1 && islower(first)){flag = true;}
len = 1
是赋值而不是比较。应该有一个编译器警告。不要忽略编译器警告!但是,即使修复该条件也不会改变最终结果,因为无论如何 flag
仍然是 true
。
最终它将大写字母转换为小写字母,将小写字母转换为大写字母:
while(flag)
....
你的逻辑是错误的。当条件说:
a) either it only contains uppercase letters; b) or all letters except for the first one are uppercase.
那么你应该只在这些条件适用时才转换字符。您不应该从 flag = true
开始,然后检查条件。
如果您使用函数,您的代码将更具可读性。我建议为每个条件编写两个函数:
bool only_uppercase_letters(const std::string& input) {
//...
}
bool first_lower_and_all_others_upper_case(const std::string& input) {
//..
}
还有第三个转换字母的函数:
void transform_letters(std::string& input) {
// ...
}
那么main
可以简单很多:
int main() {
std::string inp;
std::cin >> inp;
if (only_uppercase_letters(inp) || first_lower_and_all_others_upper_case(inp)) {
transform_letters(inp);
}
std::cout << inp;
}