我在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)
归档时间: |
|
查看次数: |
14824 次 |
最近记录: |