我一直在这些CodingBat问题,我遇到了另一个问题。
任务是这样的:
给定2个正int值,返回10到20范围内的较大值,如果两者都不在该范围内,则返回0。
一些例子:
- 最大值1020(11,19)→ 19
- 最大值1020(19,11)→ 19
- 最大值1020(11,9)→ 11
我的解决方案是:
public int max1020(int a, int b) {
if (((a >= 10 && a <= 20) || (b >= 10 && b <= 20)) && a >= b) {
return a;
}
if (((a >= 10 && a <= 20) || (b >= 10 && b <= 20)) && b >= a) {
return b;
} else {
return 0;
}
}
代码在超过一半的时间内返回了正确的输出,但在某些情况下并没有按预期工作。这些情况是当输入为(10,21)、(21,10)、(23,10)时。
这很奇怪,因为我显式地排除了#〉20,但它在上述三个场景中分别返回21、21和23。
我哪里做错了?
6条答案
按热度按时间pu3pd22g1#
让我们走过他们。
好吧,不是那个。
好吧,为什么会这样呢?因为你的逻辑说“如果任一个值在范围内,那么返回较大的值,即使较大的值不在范围内”。
相反,如果某个值超出了范围,就不要考虑它。
t1rydlwq2#
你的逻辑基本上是:
a
或b
在范围内,并且a
大于或等于b
,则返回a
。a
或b
在范围内,并且b
大于或等于a
,则返回b
。因此,如果
a
在范围内,但b
较大(并且超出范围),则仍然返回b
。将您的逻辑更改为:
a
在范围内,并且a
大于或等于b
,则返回a
。b
在范围内,并且b
大于或等于a
,则返回b
。f4t66c6m3#
pbgvytdp4#
如果其中一个值在范围内,代码将返回较大的值。
考虑到这些问题的性质,您应该尝试使用test driven approach来开发您的方法,这也可以确保您的代码按照您的预期运行。当您在CodingBat上提交代码时,可能会使用与下面类似的测试来测试您的代码。
测试
xytpbqjk5#
我想知道其他人是如何解决的,这是我想到的,其中包括三元和一点Math.abs + Math.max方法:
xmq68pz96#
下面是我提出的一个算法,它可以找到数组中的最大值,但附加条件是在特定范围内。我认为它更灵活,更容易阅读)