it-swarm.com.ru

Узнайте n номеров отсутствующих элементов из массива в Java

У меня есть массив, который несет некоторые целые числа. Скажите numbers={3,0,1} или скажите numbers={9,6,4,2,3,5,7,0,1}. Теперь я должен выяснить пропущенные числа из массива. Согласно этому примеру в каждом наборе есть только одно пропущенное число. 1-й промах 2 и 2-й промах 8. 

Я уже написал это. Мой код не только обнаруживает одно пропущенное число из указанного набора, но также может найти более 1 пропущенного числа из заданного набора.

Но если два последовательных номера отсутствуют в одном наборе, он не может найти .

My code
import Java.util.Arrays;

public class Missing_number 
{
    public static void main( String args[] )
    {
        int numbers[]={9,6,4,5,7,0,1};
        Arrays.sort(numbers);
        int i=1;

        while ( i < numbers.length ) 
        {
            if ( numbers[i] - numbers[i-1] == 1 ) 
            {
            } 
            else 
            {
                System.out.println( "Missing number is " + ( numbers[i-1] + 1 ) );
            }
            i++;
        }
    }
}

Я думаю, что если я смогу добавить 1-е пропущенное число в массив, а затем начать поиск, как будет выглядеть код? numbers={9,6,4,5,7,0,1} Теперь 8 уже отсутствуют в этом наборе. Теперь я исключил еще два элемента (2,3) из списка. Вывод: согласно моему коду: 2,8 Но 3 также отсутствует, но это не отображается. 

Я думаю, что если я смогу добавить 2 в массив чисел, то это может быть немного проще. Но, как мы все знаем, массив Java является неизменным, поэтому мы не можем увеличить его длину. 

Так что, возможно, я буду использовать Список . Но в списке этот тип индексации number[0]=something не поддерживается. Так, как я мог продолжить тогда. Я использую список или все еще застрял в массиве? 

Поэтому я предпринимаю попытку создать его с помощью arraylist.

Mycode(modified version from array)

 public class T1 {
 public static void main(String args[]){
    List<Integer> numbers=new ArrayList<>();
    numbers.add(9);
    numbers.add(6);
    numbers.add(4);
    numbers.add(5);
    numbers.add(7);
    numbers.add(0);
    numbers.add(1);
    Collections.sort(numbers);
    int i=1;
    while(i< numbers.size()) {
        if (numbers.get(i) - numbers.get(i-1) == 1) {

        } else {
            System.out.println("Missing number is " + (numbers.get(i-1) + 1));
            numbers.add((numbers.get(i-1)+1));
            Collections.sort(numbers);
        }
        i++;
    }

    }
}

Arraylist может решить мою проблему. Но есть ли вероятность, что простой массив может решить эту проблему?

11
Encipher

Этот код использует HashSet:

public static void main(String[] args) {
    int[] numbers = {9, 6, 4, 5, 7, 0, 1};
    Arrays.sort(numbers);
    HashSet<Integer> set = new HashSet<>();

    for (int i = numbers[0]; i < numbers[numbers.length - 1]; i++) {
        set.add(i);
    }

    for (int i = 0; i < numbers.length; i++) {
        set.remove(numbers[i]);
    }

    for (int x : set) {
        System.out.print(x + " ");
    }
}

напечатает:

2 3 8 


Вот как это работает:
1. Добавляет все числа от минимального номера массива до максимального номера массива в наборе.
2. Перебирает массив и удаляет каждый элемент массива из набора.
3. Распечатывает оставшиеся элементы в наборе, которые являются всеми недостающими элементами массива.

6
forpas

замените условие else следующим образом:

for(int j=numbers[i-1] + 1; j <= numbers[i] - 1; j++) {
    System.out.println( "Missing number is " + ( j ) );
}

давайте рассмотрим случай: {9, 6, 4, 5, 7, 0, 1} после сортировки он будет: {0, 1, 4, 5, 6, 7, 9} сейчас, если i в индексе 2 он находит, что разница между numbers[i] и numbers[i-1] не равна 1 (4 - 1 = 3), теперь вам нужны ВСЕ числа от 1 до 4, которые равны 2, 3, и, следовательно, вы должны выполнить цикл от numbers[i-1] до numbers[i] ( эксклюзив) для достижения этого.

Сложность этого кода большая O N(O(N)), где N является самым большим элементом в вашем массиве.

4
Mis94

Есть много вопросов, которые остались без ответа здесь. Например, Массив всегда начинается с нуля?, Каков максимально возможный размер? так далее.

Вот простой способ решения этой проблемы,

  • Найдите максимальное количество в вашем наборе.
  • Создайте пустой массив boolean длиной, равной максимальному числу, найденному на последнем шаге, плюс единица.
  • Сканируйте исходный набор и установите значение вашего нового логического массива с индексом, равным числу в вашем исходном наборе, равным true.
  • Наконец просканируйте ваш массив boolean, чтобы найти и распечатать все индексы со значением false.

Пример:

Оригинальный набор: {1,0,3}

  • Шаг 1: Максимальное количество в наборе = 3
  • Шаг 2: Логический массив с длиной = 3 + 1 -> {false, false, false, false}
  • Шаг 3: При сканировании исходного набора и значений настроек в массиве boolean это будет конечное состояние -> {true, true, false, true}
  • Шаг 4: Наконец, вы будете сканировать массив boolean для печати 2 , так как это только индекс, имеющий значение = false
1
user2004685
int[] numbers = { 11, 6, 4, 5, 7, 1 };
Arrays.sort(numbers);
int numbersArrayIndex = 0;
for (int i = 0; i < numbers[numbers.length - 1]; i++) {
    if (i == numbers[numbersArrayIndex]) {
        numbersArrayIndex++;
    }
    else {
        System.out.println(i);
    }
}
0
tech