0

10個のアイテムを含む配列で最も長く連続して増加する数値を取得しています

int list[] = {2,3,8,9,10,11,12,2,6,8};
int start_pos = 0;
int lenght=0; // lenght of the sub-~consetuve
for (int a =0; a <=9; a++ )
{

    if ((list[a]+1) == (list[a+1])) {
        // continue just the string;
        lenght++;
    } else {
        start_pos = a;
    }
}
cout << lenght  << " and start in " << start_pos;
getchar();

しかし、機能していません。最長の増加は9、10、11、12からですが、機能していないため、length&start_pos(3およびlenght 4)で戻る必要があります。

4

3 に答える 3

0

実際にサブシーケンスを意味していると仮定して、シーケンスが始まる桁を推測してから、線形スキャンを実行します。サブストリングを意味する場合は、さらに簡単です---OPの練習問題として残しておきます。

線形スキャンは次のようになります。

char next = <guessed digit>;
int len = 0;
char *ptr = <pointer to input string>;
while (*ptr) {
  if ((*ptr) == next) {
    next = next + 1;
    if (next > '9') next = '0';
    len++;
  }
  ptr++;
} 

次に、「0」から「9」までのすべての数字に設定するループでそれをラップします。これで完了です。最も長い長さの数字を選択してください。

于 2012-05-08T17:55:18.847 に答える
0

簡単なアイデア:シーケンスの開始点、終了点、および長さ。

ループiを実行します

シーケンスは、現在の番号(インデックスi)が次の番号よりも小さい場合に開始されます1=>開始点セット=i

falseを超える条件の場合に終了します=>終了点を取得します=>長さを取得します=end-start(長さを比較するためにmaxと呼ばれる変数をさらに作成します)=>結果はmaxになる可能性があり、開始点をリセットし、シーケンスの終了時に終了点=0になります

于 2012-05-08T18:02:09.497 に答える
0

私はそれを自分で作りました:

#include <iostream>

using namespace std;
bool cons(int list[] , int iv) { bool ret=true; for (int a=0; a<=iv; a++) { if (list[a] != list[a+1]-1) ret=false; } return ret; }

void main() {
int str[10] = {12,13,15,16,17,18,20,21};
int longest=0;
int pos=0;
for (int lenght=1; lenght <= 9; lenght++) {
    int li[10];
    for (int seek=0; seek <= 9; seek++) {
        for (int kor=0; kor <= lenght-1; kor ++ ) {
            li[kor] = str[seek+kor];
        }
        if (cons(li , lenght-2)) {
            longest = lenght;
            pos=seek;
        } 
    }
}

for (int b=pos; b <= pos+longest-1; b++) cout << str[b] << " - "; cout << "it is the end!" << endl; getchar();


}    
于 2012-05-09T07:36:10.633 に答える