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 個の数字を 1 つの「?」で入力します。番号で。

したがって、課題は、「クールな」数を形成できるかどうかを見つけることです。2 が 2 つ連続して (「35225」のように)、3 つが少なくとも 3 つ連続して (「353333」のように)、少なくとも 5 つが連続して (「55555237」のように) ある場合、ラッキー ナンバーは「クール」と呼ばれます。 ")、7 が 7 つ以上続く ("777777777" など)、または上記の任意の組み合わせ ("333522227" など)。

私の仕事は、数字 2、3、5、および 7 と疑問符 (?) で構成される文字列 S を読み取り、S の疑問符を数字 2 に置き換えることができるかどうかを出力するプログラムを作成することです。クールな数字を得るために、3、5、および 7 (各疑問符は 1 桁のみに置き換えることができます)。

入力文字列がクールな数値になる可能性がある場合、プログラムは「クール」を出力し、そうでない場合は「退屈」を出力する必要があります(明確にするために引用)。

例: 入力

8
233?5757

出力

cool

入力

10
57?5?757?3

出力

boring

どんなアドバイスでも大歓迎です!

4

2 に答える 2

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 に答える
0

a[index - 1]文字列内の前の文字にアクセスします。

于 2013-02-26T00:55:20.770 に答える