2012-04-23 23 views
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; 
} 

Thisは、質問へのリンクです。

+0

-scoresClump({3、4、5})真 -scoresClump→({3,4,6})→偽 -scoresClump({1、3、5、5})→真 これらはテスト配列 –

+0

が期待どおりに出力されていません。私はあなたがスコアが必要かもしれないと思う。長さ2 .. –

+0

この[リンク](http://codingbat.com/prob/p194530)でコードを試すことができます –

答えて

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; 
} 
+0

あなたはデルタ@johnb によって何を意味していますが、それを確認...私は上記のコードを変更した上で、オンラインテスト –

+0

すべての3つの値の間の最大の差は<= 2でなければなりません。これは、インデックスxの値とインデックスx + 2の値が2だけ違うことを意味します。 'x + 1に対して' xと 'x + 2に対して' x + 1 'だけをチェックすると、 xとx + 2の間にある –

+0

のように、数字の3つ組の最初と最後の数字が、2つ以上異なるのではなく、2つ以上異なることを質問していました。右? –

0

お客様のforループはfor(int i=0; i<scores.length-2; i++){でなければなりません。そうでない場合はArrayOutOfBoundsExceptionとなります。

また、お客様のbreakはであり、falseではありません。現在、条件に一致しない最初の3つの要素の後にループが存在します。彼らはすでにMath.abs

+0

私はコードを再調整しました。まだポイントはありません。私は今質問へのリンクを付けました。 –

0

ファーストを行う必要はありません昇順にソートされている場合は、エラーや予期しない動作を得た場合

また、あなたはそれが(例えば、予想と実際の出力)であるかを説明すべきです。

あなたのコードで少なくとも1つのエラーが発生する可能性があります。ループスコア[i + 2]でアクセスできます。私が長さ1になると、あなたは長さ+1にアクセスします。最後の要素はインデックスの長さ-1を持つため、length + 0にアクセスすることもエラーです。あなたは完全なコードを示していませんでしたが、スローされた例外のために結果が呼び出し関数にfalseとして解釈されると仮定します。

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

+0

これは私の編集コードである: \tパブリックブールscoresClump([]スコアをINT){ \t \t \t \tブール結果= FALSE; \t \t \t \t for(int i = 0; i <スコア。長さ-2;私は((スコア[I + 1] -scores [I])場合、{) \t \t \t ++を<= 2 &&(スコア[I + 2] -scores [I + 1])<= 2){ \t \t \t \t結果=真; \t \t \t \t break; \t \t \t} \t \t} \t \t \t \tリターン結果。 \t} 偽でなければならないところではまだ真を出力します。 これはテストリンクです。[リンク](http://codingbat.com/prob/p194530) –

+0

更新されたコードをコメントやリンクとして投稿しないでください。質問を更新してください。 –

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; 
} 
+0

働かなかった、 (http://codingbat.com/prob/p194530)[このリンクを試す] –

+0

なぜscoresClumpは({3,4,6})偽でなければならない必要がありますか? – Kshitij

+0

それが私が困惑している理由です。回答のあるサンプルテストの質問が壊れているかどうかはわかりません。 –

関連する問題