一个java练习题

fei*_*fei 9 java logic

我在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;
}
Run Code Online (Sandbox Code Playgroud)

这通过了测试.但我自己找到了一个反例:makeBricks(10,0,10) - > true.我的逻辑将返回错误.我该如何修复逻辑?或者有更好的方法吗?

Don*_*kby 18

我想你可以删除你的第二个测试.我会试试这个:

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


cle*_*tus 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

足够了.这可以简化为:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,对于负目标,小或大的理智检查并非严格要求,但建议.没有这些检查,结果可以简单地通过以下方式获得:

public boolean makeBricks(int small, int big, int goal) {
  return goal <= big * 5 + small && goal % 5 <= small;
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,不,不会.目标<=大*5 +小吗?是.但是目标%5是4.小是0所以它返回false.请在错误地说明错误之前尝试一下. (15认同)