0
#include <iostream>
#include <string>

using namespace std;

int main()
{

    string a;
    cin >> a;

    int index = a.find('?');


    if(a[index]-1==3)
    {
        if(a[index]-2==3)
        {
            cout << "cool" << endl;
        }
    }

    return 0;
}

我到目前为止的代码。我正在做一个在线挑战,这里是文本(由我自己翻译,因为它是我的母语)。

您输入一个给定的数字“N”您的数字将是多长时间。之后,您输入 N 个数字和一个“?” 在号码中。

所以,挑战在于找到我们是否可以形成一个“酷”的数字。如果一个幸运数字连续包含至少 2 个二(如“35225”)、连续至少三个三(如“353333”)、连续至少五个五(如“55555237”,则该幸运数字称为“酷” ”),至少连续 7 个七人制(如“777777777”),或以上任意组合(如“333522227”)。

我的工作是编写一个程序,它将读取由数字 2、3、5 和 7 和问号 (?) 组成的字符串 S,并输出 S 中的问号是否可以替换为数字 2, 3、5 和 7 以得到一个很酷的数字(每个问号只能用一位数字代替)。

如果输入字符串可以变成很酷的数字,程序应该输出“cool”,否则应该输出“boring”(为了清楚起见,引用)。

示例:输入

8
233?5757

输出

cool

输入

10
57?5?757?3

输出

boring

欢迎任何建议!

4

2 回答 2

0

a[index - 1]访问字符串中的前一个字符。

于 2013-02-26T00:55:20.770 回答
0

许多事:

cin >> a;

不检查您是否实际读取了变量...我建议:

if (cin >> a) 
{
    // use a...

}

下一个...

int index = a.find('?');
if(a[index]-1==3)

在这里,它应该是a[index - 1],但只有在 时才有效index > 0。尝试访问 < 0 的元素具有未定义的行为 - 基本上这意味着您将得到垃圾结果或崩溃。如果你使用a.at(index - 1)编译器,如果你的代码创建了一个无效的索引,编译器会抛出一个异常——这更安全:然后你可以找出原因并修复你的代码。

其次,字符以 ASCII 表示形式存储。要获得 ASCII 数字 3,您需要在程序中编码“3” a[index - 1] == '3':.

更一般地说,回答这个问题的最快方法是从右到左扫描:如果你看到一个数字,然后检查那个数字是否开始了相同数字或“?”的其他实例的“酷”序列。如果您扫描并无法完成一个很酷的序列,您可以考虑不匹配的字符,在字符串中向左后退时添加一个“?”的计数,然后一旦到达字符串的开头非-'?' 您可以向前扫描到新字符。这有点棘手,但将是最有效的解决方案....

于 2013-02-26T01:43:36.300 回答