0

次のメソッドは、整数のリスト内でソートされた最長のシーケンスの長さを返す必要があります。たとえば、list という変数が次の値のシーケンスを格納する場合:{11,12,30,41,5,3,7,6}を返す必要があり4ます。

ソートされた最長シーケンスが先頭から始まる場合、このメソッドはテストに失敗します ( を返します3) が、他のテストでは機能します。問題がどこにあるか誰か知っていますか?ありがとうございました。

public int longestSortedSequence() {

    int count = 0;
    int max1 = 0;
                int max2 = 0;

    for (int i = 0; i < size; i++) {
        if (elementData[i] <= elementData[i + 1]) {
            count++;
            if (count >= max1) {
                max1 = count;

            }
        } else if (elementData[i] > elementData[i + 1]) {
            count = 0;
            count++;
            if (count >= max2) {
                max2 = count;
            }
        }
    }
    return Math.max(max1, max2);
}
4

2 に答える 2

1

2 つのコメント:

  1. ごとに、要素が現在の非減少シーケンスを継続するiかどうかをテストしています。i+1したがって、ループの最初の繰り返しの前に、現在の非減少シーケンスに属する要素 0 を既にカウントしているはずです。最初の繰り返しで、要素 1 がそのシーケンスを継続するかどうかをテストします。つまりcount、最初は 1 に設定する必要があります。

  2. コードは、for ループの最後の反復で ArrayIndexOutOfBoundsException をスローする可能性がありi+1ます。これは、配列の有効なインデックスではないサイズが等しいためです。

于 2013-02-24T23:42:03.780 に答える
0
  • あなたの質問のコードはたくさんのコピー&ペーストを使っていたと思います。例: if (count>=max)部品。

  • ループIndexOutOfBoundExcep.を読み取り、条件を設定すると、コードがスローされる可能性がありますe[i+1]i<size

  • count配列が空でない場合は、少なくとも1(降順のソートの場合)である必要があります。配列が空の場合は、0を返します。

いくつか修正を加えて、少し書き直しました。(IDEでの書き込みなし、テストもされていません)。いくつかのアイデアを示してください。

public int longestSortedSequence() {
    if (size==0)return 0; //empty array
    int count = 1; //at least 1
    int max = 1;
    for (int i = 0; i < size-1; i++) {
        if (elementData[i] <= elementData[i + 1]) {
            count++;          
        } else {
            max=count>max?count:max;
            count = 1;
        }
    }
    return count>max? count: max;
}
于 2013-02-24T23:50:43.093 に答える