我一直关注这些CodingBat问题而我遇到了另一个问题。
作业是这样的:
给定2个正的int值,返回10..20(含)范围内的较大值,如果两者都不在该范围内,则返回0。
一些例子:
我的解决方案是:
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)。
这很奇怪,因为我明确排除了#&gt; 20但它分别为上述三种情况返回了21,21和23。
我在哪里弄错了?
答案 0 :(得分:4)
让我们走过去。
(10,21):
if(((10 >= 10 && 10 <= 20) || (21>=10 && 21<=20)) && 10>=21)
(((true and true) || (true and false)) && false)
((true) && false)
false
好的,不是那个。
if(((10 >= 10 && 10 <= 20) || (21>=10 && 21<=20)) && 21>=10)
(((true and true) || (true and false)) && false)
((true) and true)
true
-> return 21
好的,为什么会这样?因为你的逻辑说“如果任何一个值在范围内,那么返回更大的值,即使更大的值不在范围内”。
相反,如果某个值超出范围,请不要考虑它。这是一个可能的开始:
if(a < 10 && a > 20) {
// do something with only b. This is where you would return zero, too.
} else if(b < 10 && b > 20) {
// do something with only a
} else {
// do something with both
}
答案 1 :(得分:3)
你的逻辑基本上说:
a
或b
在范围内且a
大于或等于b
,则返回a
。a
或b
在范围内且b
大于或等于a
,则返回b
。因此,如果a
在范围内但b
更大(且超出范围),则仍会返回b
。
将您的逻辑更改为:
a
在范围内且a
大于或等于b
,则返回a
。b
在范围内且b
大于或等于a
,则返回b
。答案 2 :(得分:0)
如果任一值在范围内,则代码返回较大的值。
鉴于这些问题的性质,您应该尝试test driven approach来开发您的方法,这也可以确保您的代码按照您的意图行事。类似于以下内容的测试可能就是在CodingBat上提交代码时测试代码的内容。
public class SandBox {
public int max1020(int a, int b) {
if (10 <= a && a <= 20) { // if a is in range
if (a >= b || b > 20) { // if a is greater than B or B is out of range
return a;
}
}
//
if (10 <= b && b <= 20) { // if b is in range
return b;
}
return 0;
}
}
测试
import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public class SandBoxTest {
SandBox sand;
@Before
public void given(){
sand = new SandBox();
}
@Test
public void testOne(){
int i = sand.max1020(1, 2);
assertThat(i, is(0));
}
@Test
public void testTwo(){
int i = sand.max1020(2, 1);
assertThat(i, is(0));
}
@Test
public void testThree(){
int i = sand.max1020(5, 10);
assertThat(i, is(10));
}
@Test
public void testFour(){
int i = sand.max1020(10, 5);
assertThat(i, is(10));
}
@Test
public void testFive(){
int i = sand.max1020(11, 15);
assertThat(i, is(15));
}
@Test
public void testSix(){
int i = sand.max1020(15, 11);
assertThat(i, is(15));
}
@Test
public void testSeven(){
int i = sand.max1020(20, 23);
assertThat(i, is(20));
}
@Test
public void testEight(){
int i = sand.max1020(23, 20);
assertThat(i, is(20));
}
@Test
public void testNine(){
int i = sand.max1020(33, 25);
assertThat(i, is(0));
}
@Test
public void testTen(){
int i = sand.max1020(25, 33);
assertThat(i, is(0));
}
}
答案 3 :(得分:0)
Boolean aInRange = (a >= 10 && a <= 20)
Boolean bInRange = (b >= 10 && b <= 20)
int max = 0;
if (aInRange && bInRange) {
if(a >= b)
max = a;
else {
max = b;
}
} else if (!bInRange && aInRange) {
max = a;
}
else if (bInRange && !aInRange) {
max = b;
}
return max;