确定连续数字的布尔方法

时间:2016-10-14 07:26:22

标签: java boolean

编写一个名为continuous的方法,它接受三个整数作为参数,如果它们是三个连续的数字则返回true;也就是说,如果数字可以排列成顺序,使得存在一些整数k,使得参数的值是k,k + 1和k + 2。如果整数不连续,则您的方法应返回false。请注意,订单并不重要;对于以任何顺序传递的相同三个整数,您的方法应返回相同的结果。 例如,连续呼叫(1,2,3),连续(3,2,4)和连续(-10,-8,-9)将返回true。连续(3,5,7),连续(1,2,2)和连续(7,7,9)的呼叫将返回false。

这是我到目前为止所得到的并且不断出现无限循环错误并跳过测试

public boolean consecutive(int x, int y, int z) {
Scanner kb = new Scanner(System.in);
x = kb.nextInt();
y = kb.nextInt();
z = kb.nextInt();
if (((x < y && x < z) && (y < z && ((y - x) == 1) && ((z - x) == 2))) 
   ||((z < y && ((z - x) == 1) && ((y - x) == 2)))) 
{
    return true;
} else if (((y < x && y < z)&& (x < z && ((x - y) == 1) && ((z - y) == 2))) 
   || ((z < x && ((z - y) == 1) && ((x - y) == 2))))
{
        return true;
} else if (((z < x && z < y)&& (y < x && ((y - z) == 1) && ((x - z) == 2))) 
   ||((x < y && ((x - z) == 1) && ((y - z) == 2))))
{
    return true;
} else {
    return false;
}

5 个答案:

答案 0 :(得分:1)

你所拥有的是严重的过度杀戮,对于那些没有在C中度过大部分职业生涯的人来说几乎是不可读的: - )

您应该始终首先争取可读性(以及可维护性),只有在绝对必要时才会恢复不太可读的代码。即使你确实还原,你应该记录你为什么以及你做了什么,这样下一个不得不维护你的代码的可怜的灵魂就不会诅咒你的名字。

对于这种特定情况,您尝试的内容可以通过更简单的代码实现,例如以下(伪代码):

def areConsecutive(a, b, c):
    if a > b: swap a, b
    if b > c: swap b, c
    if a > b: swap a, b
    return (b - a == 1) and (c - b == 1)

三个if语句只是一个展开的冒泡排序,以确保abc按升序排列,然后您只需检查以确保它们之间的区别在这两种情况下都是一个。

没有必要将它们放入列表或数组中进行排序,因为排序三个项目相对容易(可以使用int t = a; a = b; b = t;进行交换。)

就Java代码而言(一旦你将输入移动到外部它所属的函数),你最终会得到类似的东西:

bool areConsecutive(int a, int b, int c) {
    int t;
    if (a > b) { t = a; a = b; b = t; }
    if (b > c) { t = b; b = c; c = t; }
    if (a > b) { t = a; a = b; b = t; }
    return (b - a = 1) && (c - b == 1);
}

答案 1 :(得分:0)

连续方法传递三个值,然后是你从控制台读取的原因。

  

创建一个大小为3个元素的数组。

     

使用Arrays.Sort方法

对数组进行排序      

检查第二个和第一个数字之间的差异是1,第三个和第二个数字之间的差异是1.

代码:

public boolean consecutive(int x, int y, int z) {
int [] numbers = new int [3];
numbers[0] = x;
numbers[1] = y;
numbers[2] = z;
Arrays.sort(numbers);
boolean isConsecutive = (numbers[1]==numbers[0]+1)&&(numbers[2]==numbers[1]+1);
return isConsecutive;
}

答案 2 :(得分:0)

当您传递价值时,为何使用扫描仪? 删除这些线及其工作。您可以使用另一个逻辑来确定连续的数字。

public boolean consecutive(int x, int y, int z) {
     if (((x < y && x < z) && (y < z && ((y - x) == 1) && ((z - x) == 2))) ||((z < y && ((z - x) == 1) && ((y - x) == 2)))) {
        return true;
     } else if (((y < x && y < z)&& (x < z && ((x - y) == 1) && ((z - y) == 2))) ||
                                ((z < x && ((z - y) == 1) && ((x - y) == 2)))){
        return true;
     } else if (((z < x && z < y)&& (y < x && ((y - z) == 1) && ((x - z) == 2))) ||((x < y && ((x - z) == 1) && ((y - z) == 2)))){
        return true;
     } else
       return false;
 }

答案 3 :(得分:0)

只需删除这些代码:

Scanner kb = new Scanner(System.in);
x = kb.nextInt();
y = kb.nextInt();
z = kb.nextInt();

或使用像这样:

public class test{
  public static void main(String[] args) {
                Scanner kb = new Scanner(System.in);
        x = kb.nextInt();
        y = kb.nextInt();
        z = kb.nextInt();
      System.out.println("Result:" + consecutive(x, y, z));

    }

    public static boolean consecutive(int x, int y, int z) {
        if (((x < y && x < z) && (y < z && ((y - x) == 1) && ((z - x) == 2))) || ((z < y && ((z - x) == 1) && ((y - x) == 2)))) {
            return true;
        } else if (((y < x && y < z) && (x < z && ((x - y) == 1) && ((z - y) == 2)))
                || ((z < x && ((z - y) == 1) && ((x - y) == 2)))) {
            return true;
        } else if (((z < x && z < y) && (y < x && ((y - z) == 1) && ((x - z) == 2))) || ((x < y && ((x - z) == 1) && ((y - z) == 2)))) {
            return true;
        } else {
            return false;
        }
    }
}

答案 4 :(得分:0)

创建一个包含数字的列表,对其进行排序并对元素之间进行差异处理:

public static boolean myConsecutive(int x, int y, int z) {
        final List<Integer> list = new ArrayList<>();
        list.add(x);
        list.add(y);
        list.add(z);

        Collections.sort(list);
        return (list.get(2) - list.get(1) == 1 && list.get(1) - list.get(0) == 1);
}