在一个范围内找到更大的数字

时间:2013-05-03 21:14:15

标签: java

我一直关注这些CodingBat问题而我遇到了另一个问题。

作业是这样的:

  

给定2个正的int值,返回10..20(含)范围内的较大值,如果两者都不在该范围内,则返回0。

一些例子:

  • max1020(11,19)→19
  • max1020(19,11)→19
  • max1020(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)。

这很奇怪,因为我明确排除了#&gt; 20但它分别为上述三种情况返回了21,21和23。

我在哪里弄错了?

4 个答案:

答案 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)

你的逻辑基本上说:

  • 如果ab在范围内且a大于或等于b,则返回a
  • 如果ab在范围内且b大于或等于a,则返回b
  • 返回0。

因此,如果a在范围内但b更大(且超出范围),则仍会返回b

将您的逻辑更改为:

  • 如果a在范围内且a大于或等于b,则返回a
  • 如果b在范围内且b大于或等于a,则返回b
  • 返回0。

答案 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;