法官在 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;
}