Codeforces问题131A - http://codeforces.com/problemset/problem/131/A 我在Windows 7上使用Dev C ++ 5.5.2(我已经输入了Visual Studio 2010 C ++语言)。虽然我在计算机上运行我的解决方案得到了正确的输出,但我在Codeforces的测试用例3中得到了错误的答案。
法官的日志:
est:#3,时间:0 ms。,内存:0 KB,退出代码:0,检查退出代码:1,判决结果:WRONG_ANSWER 输入 大写锁定 产量 大写锁定 回答 大写锁定 检查日志 错误答案第一句话有所不同 - 预期:'cAPSlOCK',发现:'Capslock'
我的解决方案:
#include<iostream>
using namespace std;
char a[101];
int i,b;
int main()
{
cin>>a;
b=a[0];if(b>90)
{
b=b-32;
a[0]=b;
}
for(i=1;a[i]!=NULL;i++)
{
b=a[i];
if(b<97)
{
b=b+32;
a[i]=b;
}
}
cout<<a;
}
我的解决方案应该如何改变才能在网上判断中正常工作?
答案 0 :(得分:1)
对于初学者,您应该使用标准函数isupper
,
等(在<ctype.h>
中 - 只记得你必须转换
使用之前的任何char
到unsigned char
)。在
特别是,你的代码似乎假设1)编码是
ASCII(虽然没有现代机器使用ASCII),2)表示
单词只包含字母字符。 (你也没能
检查输入是否成功。)
其次,指定的条件涉及整个字符串,而不是 只是第一个角色。只是测试第一个角色 不可能满足;你必须检查一下每一个角色 串。 (问题的实际规范也不是这样 明确;除了第一个之外的所有字母是什么意思,如果有的话 只有一个字母?)
第三,无论结果如何,都可以循环转换
您的if
。这肯定是错的。
这里有两个不同的问题。首先是确定 是否已设置大写锁定键。最简单的方法是 类似的东西:
if ( std::find_if( word.begin() + 1,
word.end(),
[]( unsigned char ch ) { return !isupper( ch ); } )
== word.end() )
(这是一个简化,因为它对所有人都返回true 字符串。但这是一种可能的解释 规格,虽然我不认为非常直观 之一。)
如果你不想使用像std::find_if
这样的功能,那么你
应该将其分解为一个单独的函数:
bool
capsLockSet( std::string const& word )
{
auto current = word.begin() + 1;
while ( current != word.end()
&& isupper( static_cast<unsigned char>( *current ) ) ) {
++ current;
}
return current == word.end();
}
同样,您可以使用std::transform
进行转换
(仅在上面返回true时才执行),或者将循环因子排除
分成一个单独的功能;在这两种情况下,第一个字符
将需要特殊处理,因为如果是小写,你
必须将其转换为上层。 ( IF 你有一个先决条件
您将看到的唯一字符是ASCII字母,然后就可以了
由ch ^= 0x20
在上下之间切换。我推荐
反对它,因为它依赖于编码,和
事实上,只有信件存在,而没有其他
字符)。
答案 1 :(得分:1)
关于“我应该如何改变我的解决方案,以便在网上判断中正确运作?”
问题表明:只有在与第一个字符分开时才更改单词 错误报告指出:cAPSlOCK应返回cAPSlOCK,而不是Capslock 因此,如果不应该更改输入,至少应该在程序中检查输出输入。
关于程序:您可以使用cctype中的帮助函数:isupper()
,islower()
,toupper()
和tolower()
,这样您和我们就可以更轻松地使用了解发生了什么。