我找到了一个简单的Java练习,并回答了它,但是我的代码似乎有问题,我似乎找不到问题。请指出这个问题:
问题是:
我们要制作goal
英寸长的砖块。我们有许多小砖(每个1英寸)和大砖(每个5英寸)。如果可以通过从给定的积木中选择来达成目标,则返回true
。这比看起来要难一点,并且可以完成而没有任何循环。
然后我将此功能作为答案:
public boolean makeBricks(int small, int big, int goal) {
if (small>=goal) return true;
if ((goal>=5) && (big>=1)){ makeBricks(small,big-1,goal-5);}
return false;
}
但是在https://codingbat.com/prob/p183562上运行它时,它表示这是错误的,对我来说一切都正确。
答案 0 :(得分:2)
在您的递归调用之前放置一个return
:
return makeBricks(small,big-1,goal-5);
答案 1 :(得分:2)
添加return
语句可解决您的技术问题,即无法确定堆栈中更深处调用的真实值,但这是可以用基本数学算法在恒定时间内解决的问题的线性解决方案: / p>
public boolean makeBricks(int small, int big, int goal) {
return big * 5 + small >= goal && goal % 5 <= small;
}
这里的想法是首先确定我们所有组合的砖块是否达到或超过目标:big * 5 + small >= goal
。如果我们不能满足这个方程式,那么我们肯定不走运。
但是,这过于乐观,不能解决我们有足够的区块超过目标但没有足够的小区块来移除一些较大的区块并达到目标的情况。测试goal % 5 <= small
可确保我们有足够的小块来弥合每个大块被删除后剩下的5个空白。
如果仍然不清楚,我们来看一个极端的情况:makeBricks(3, 2, 9)
。我们的目标是9,我们有3个小块和2个大块。结合我们的整个武库,总共有13个,这似乎足以满足目标。但是,如果我们忽略其中一个大块,那么我们可以得到的最接近的是8。如果我们忽略所有所有小块,那么我们可以得到的最接近的是10。无论我们做什么,目标都是一个遥不可及的目标。
让我们根据我们的公式9 mod 5 == 4
进行检查,该公式比小块数3多1,并且与我们的手工计算匹配。我们应该在此输入上返回false
。另一方面,如果我们有1个额外的小块,9 % 5 == small
将是正确的,并且我们将有足够的块来弥合差距。