首页 > 解决方案 > 法官在 cAPS LOCK 中说错误的答案

问题描述

每个人。在 Codeforces 上的问题cAPSlOCK中,法官说测试用例 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”

我非常感谢任何人在这里的意见。

标签: c++conditional-operator

解决方案


您真的应该使用调试器来查看代码的作用。使用调试器,您将看到输入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) 要么只包含大写字母;b) 或除第一个字母外的所有字母均为大写字母。

那么你应该只在这些条件适用时才转换字符。你不应该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;
}

推荐阅读