0

次の質問のコードを書きましたが、出力が期待どおりではありません。私のコードに何か問題があるかどうかはわかりません。ロジックは問題ないようです。私のコードに何か問題があるかどうか、誰でも見ることができますか。

昇順で並べ替えられたスコアの配列が与えられた場合、{3, 4, 5} や {3, 5, 5} のように、互いに最大 2 だけ異なる 3 つの隣接するスコアが配列に含まれている場合、true を返します。

私のソースコードは次のとおりです。

public boolean scoresClump(int[] scores) {

    boolean result = false;

    for(int i=0; i<scores.length-2; i++){
        if((scores[i+1]-scores[i])<=2 && (scores[i+2]-scores[i+1])<=2){
            result = true;
            break;
        }
    }

    return result;
}

これは質問へのリンクです。

4

4 に答える 4

2

どうぞ。以前の投稿では、隣接していない値の間のデルタが考慮されていませんでした。

public boolean scoresClump(int[] scores) {
  boolean result = false;

  for(int i=0; i<scores.length-2; i++){
      if((scores[i+2]-scores[i])<=2){
          result = true;
          break;
      }
  }

  return result;
}
于 2012-04-23T11:33:19.480 に答える
0

あなたのforループはfor(int i=0; i<scores.length-2; i++){そうでなければなりませんArrayOutOfBoundsException.

また、あなたは条件付きではなく、条件付きbreakでなければなりません。現在、条件に一致しない 3 つの要素の最初のセットの後にループが存在します。truefalse

また、それらがすでに昇順でソートされている場合は、実行する必要はありませんMath.abs

于 2012-04-23T11:19:34.433 に答える
0

まず、エラーまたは予期しない動作が発生した場合は、それが何であるかを説明する必要があります (例: 予期される出力と実際の出力)。

あなたの場合、あなたのコードで少なくとも 1 つのエラーを見つけることができます: ループ スコア [i+2] にアクセスします。length-1 まで上げると、length+1 にアクセスします。最後の要素のインデックスは長さ-1 であるため、長さ+0 にアクセスするだけでも既にエラーになります。完全なコードは表示されませんでしたが、例外がスローされたため、結果は呼び出し元の関数で false と解釈されると思います。

さらに、次の反復で次のチェックを実行するため、2 つのチェックは必要ありません。1 つのチェックで十分です。

于 2012-04-23T11:19:40.613 に答える
0

これを試して:

    public boolean scoresClump(int[] scores) {
boolean result=false;
for(int i=0; i<scores.length-2; i++){
        if(Math.abs(scores[i]-scores[i+1])<=2 &&
        Math.abs(scores[i+1]-scores[i+2])<=2 &&
        Math.abs(scores[i]-scores[i+2])<=2){
            result=true;
        }
}
return result;
}
于 2012-04-23T11:26:44.913 に答える