Логический метод для определения последовательных чисел

#java #boolean

#java #логическое значение

Вопрос:

Напишите метод с именем consecutive, который принимает три целых числа в качестве параметров и возвращает 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 amp;amp; x < z) amp;amp; (y < z amp;amp; ((y - x) == 1) amp;amp; ((z - x) == 2))) 
   ||((z < y amp;amp; ((z - x) == 1) amp;amp; ((y - x) == 2)))) 
{
    return true;
} else if (((y < x amp;amp; y < z)amp;amp; (x < z amp;amp; ((x - y) == 1) amp;amp; ((z - y) == 2))) 
   || ((z < x amp;amp; ((z - y) == 1) amp;amp; ((x - y) == 2))))
{
        return true;
} else if (((z < x amp;amp; z < y)amp;amp; (y < x amp;amp; ((y - z) == 1) amp;amp; ((x - z) == 2))) 
   ||((x < y amp;amp; ((x - z) == 1) amp;amp; ((y - z) == 2))))
{
    return true;
} else {
    return false;
}
 

Комментарии:

1. Ааааа , мои глаза 🙁 :-/

2. Бесконечный цикл ? без циклов или рекурсивного вызова… Я не буду комментировать этот алгоритм

3. Хорошо, давайте поговорим об этом коде… почему вы получили x,y,z в параметрах, каковы vlaue? Вы никогда не закрываете сканер, это плохо. И для логики вы должны попробовать некоторую математику вместо ЧИСТОГО условия или просто найти меньшее и большее число…

4. Для быка нет более красной тряпки, чем совершенно ненужная if ... then return else конструкция 🙂 Отбросьте else строки, поскольку, независимо от того, вернули ли вы if часть или продолжили, они не имеют никакого эффекта.

Ответ №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 оператора представляют собой просто развернутую пузырьковую сортировку для обеспечения a b и c расположены в порядке возрастания, затем вы просто проверяете, чтобы убедиться, что разница между ними равна единице в обоих случаях.

Нет необходимости помещать их в список или массив для их сортировки, поскольку сортировка трех элементов относительно проста (обмен можно выполнить с 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) amp;amp; (c - b == 1);
}
 

Ответ №2:

Когда вы передаете значение, зачем использовать сканер? Удалите эти строки и их работу. Вы можете использовать другую логику для определения последовательных чисел.

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

Ответ №3:

Просто удалите этот код:

 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 amp;amp; x < z) amp;amp; (y < z amp;amp; ((y - x) == 1) amp;amp; ((z - x) == 2))) || ((z < y amp;amp; ((z - x) == 1) amp;amp; ((y - x) == 2)))) {
            return true;
        } else if (((y < x amp;amp; y < z) amp;amp; (x < z amp;amp; ((x - y) == 1) amp;amp; ((z - y) == 2)))
                || ((z < x amp;amp; ((z - y) == 1) amp;amp; ((x - y) == 2)))) {
            return true;
        } else if (((z < x amp;amp; z < y) amp;amp; (y < x amp;amp; ((y - z) == 1) amp;amp; ((x - z) == 2))) || ((x < y amp;amp; ((x - z) == 1) amp;amp; ((y - z) == 2)))) {
            return true;
        } else {
            return false;
        }
    }
}
 

Ответ №4:

Создайте список с числами, отсортируйте его и выполните различие между элементами:

 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 amp;amp; list.get(1) - list.get(0) == 1);
}
 

Ответ №5:

Последовательный метод передается с тремя значениями, тогда почему вы читаете с консоли.

создайте массив размером в 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)amp;amp;(numbers[2]==numbers[1] 1);
return isConsecutive;
}