#java
#java
Вопрос:
Я написал программу, которая считывает массив целых чисел и два числа n
и m
. Программа проверяет это n
и m
никогда не встречается рядом друг с другом (в любом порядке) в массиве.
import java.util.*;
class Main {
public static void main(String[] args) {
// put your code here
Scanner scanner = new Scanner (System.in);
int len = scanner.nextInt();
int [] array = new int [len];
boolean broken = false;
for (int i = 0; i < len; i ){
array [i] = scanner.nextInt();
}
int n = scanner.nextInt();
int m = scanner.nextInt();
for (int j = 1; j < len; j ){
if((array[j]==n)amp;amp;(array[j 1]==m) || (array[j]==n)amp;amp;(array[j-1]==m) || (array[j]==m)amp;amp;(array[j 1]==n) || (array[j]==m)amp;amp;(array[j-1]==n)){
broken = true;
break;
}
}
System.out.println(broken);
}
}
Тестовый ввод:
3
1 2 3
3 4
Правильный вывод: true
Мой вывод пустой. Что я делаю не так?
Комментарии:
1. Вы уверены, что не получаете ArrayIndexOutOfBoundsException?
Ответ №1:
Ваш код будет генерироваться ArrayIndexOutOfBoundsException
по мере использования array[j 1]
, тогда как у вас есть условие цикла as j < len
. Условие должно быть j < len -1
.
Следующее работает, как и ожидалось:
for (int j = 1; j < len - 1; j ) {
if ((array[j] == n amp;amp; array[j 1] == m) || (array[j] == n amp;amp; array[j - 1] == m)
|| (array[j] == m amp;amp; array[j 1] == n) || (array[j] == m amp;amp; array[j - 1] == n)) {
broken = true;
break;
}
}
Пример запуска:
3
1 2 3
3 4
true
Ответ №2:
Ваш код будет выдан ArrayIndexOutOfBoundsException
из array[j 1]
-за того, где может быть j len-1
. На самом деле вам не нужно проверять обе стороны (предыдущий и следующий элемент), достаточно проверить комбинацию с предыдущим, поскольку на следующей итерации будет проверена комбинация со следующим элементом.
for (int j = 1; j < len; j ){
if((array[j]==n amp;amp; array[j-1]==m) || (array[j]==m amp;amp; array[j-1]==n)){
broken = true;
break;
}
}
Ответ №3:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int len = scan.nextInt();
Map<Integer, Set<Integer>> map = new HashMap<>();
for (int i = 0, prv = 0; i < len; i ) {
int num = scan.nextInt();
if (!map.containsKey(num))
map.put(num, new HashSet<>());
if (i > 0)
map.get(prv).add(num);
prv = num;
}
int n = scan.nextInt();
int m = scan.nextInt();
boolean res = !map.containsKey(n) || !map.containsKey(m) || !map.get(n).contains(m) amp;amp; !map.get(m).contains(n);
System.out.println(res);
}