9

javabat( http://www.javabat.com/prob/p183562 )でこの問題に遭遇しました:

ゴール インチの長さのレンガの列を作りたいと考えています。小さなレンガ (それぞれ 1 インチ) と大きなレンガ (それぞれ 5 インチ) がいくつかあります。指定されたブロックから選択してゴールを作ることができる場合は true を返します。これは見た目よりも少し難しく、ループなしで実行できます。

makeBricks(3, 1, 8) → true
makeBricks(3, 1, 9) → false
makeBricks(3, 2, 10) → true

私はこの解決策を思いつきました:

public boolean makeBricks(int small, int big, int goal) {
    if (goal > small + big * 5)
        return false;
    else if (goal % 5 == 0) 
        return goal / 5 <= big;
    else
        return goal % 5 <= small;
}

これはテストに合格しました。しかし、私は反例を自分で見つけました: makeBricks(10, 0, 10) -> true. 私のロジックは false を返します。ロジックを修正するにはどうすればよいですか? または、これを行うより良い方法はありますか?

4

16 に答える 16

18

2番目のテストを削除するだけでよいと思います。私はこれを試してみます:

public boolean makeBricks(int small, int big, int goal) {
    if (goal > small + big * 5)
        return false;
    else
        return goal % 5 <= small;
}

最初のテストは、すべてのレンガを一列に並べた場合の列の長さをチェックするだけです。それが目標に達していない場合、それは不可能であることがわかります。

次に、小さなレンガの最小数を計算します: goal % 5. たとえば、目標が 8 で、大きなブロックが 1000 個ある場合、小さなブロックはいくつ必要ですか? 8 % 5は 3 なので、列の最後に 3 つの小さなレンガが必要です。

小さなレンガが十分にあり、すべてのレンガの全長が十分であれば、目標を達成できます。

于 2009-06-28T01:08:21.007 に答える
11

あなたの論理は正しくありません。これはそれを行う必要があります:

public boolean makeBricks(int small, int big, int goal) {
  if (goal < 0 || big < 0 || small < 0) {
    throw new IllegalArgumentException();
  } else if (goal > big * 5 + small) {
    return false;
  } else if (goal % 5 <= small) {
    return true;
  } else {
    return false;
  }
}

十分なものです。これは次のように簡略化できます。

public boolean makeBricks(int small, int big, int goal) {
  if (goal < 0 || big < 0 || small < 0) {
    throw new IllegalArgumentException();
  } else {
    return goal <= big * 5 + small && goal % 5 <= small;
  }
}

もちろん、小さいか大きいかの負の目標のサニティ チェックは厳密には必須ではありませんが、推奨されます。これらのチェックがなければ、結果は次の方法で簡単に取得できます。

public boolean makeBricks(int small, int big, int goal) {
  return goal <= big * 5 + small && goal % 5 <= small;
}
于 2009-06-28T01:07:05.190 に答える
1

2番目のチェックはそれをbigsと比較するだけなので、falseを返します。反例ではゼロです。

したがって、2<=0 は false です。

これを行う良い方法は次のとおりです。

return (Math.min(goal/5,big)*5 + small) >= goal;

このようにして、必要な数の大きなブロックのみを確実に使用することができますが、それ以上のブロックを使用する必要はありません。目標を達成する唯一の方法は、十分な数の小さなブロックを使用することです。

于 2009-06-28T01:09:01.973 に答える
0

これが私の答えです。

private static boolean makeBricks (int small, int big, int goal) {

    return ((big * 5 + small) >= goal) && (goal % big <= small);
}
于 2012-05-10T18:16:00.343 に答える
0
private boolean  makeBricks(int small, int big, int goal) 
{
    if (goal < 0 || big < 0 || small < 0)
    {
        throw new IllegalArgumentException(); 
    }
    else return goal - (5 * big + small) <= 0;
}

これです。それが行われる方法です。

于 2015-03-18T04:21:00.750 に答える
0

パブリック クラス ブリック {

public boolean checkMethod(int small, int big, int goal) {
    if (goal <= small + big * 5 && goal >= big * 5) {
        return true;
    } else
        return false;
}

public static void main(String args[]) {
    Bricks brick = new Bricks();
    System.out.println(brick.checkMethod(10, 0, 10));
}

}

于 2014-10-14T08:55:11.287 に答える