#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;
}