Числа никогда не встречаются рядом друг с другом

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