Узнайте 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 может решить мою проблему. Но есть ли вероятность, что простой массив может решить эту проблему?
Ответы
Ответ 1
Этот код использует 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. Распечатывает оставшиеся элементы в наборе, которые являются всеми недостающими элементами массива.
Ответ 2
заменить условие 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
является самым большим элементом в вашем массиве.
Ответ 3
Есть много вопросов, которые остались без ответа здесь. Например, всегда ли массив начинается с нуля? Какой максимальный размер? и т.п.
Вот простой способ решения этой проблемы,
- Найдите максимальное количество в вашем наборе.
- Создайте пустой
boolean
массив длины, равной максимальному числу, найденному на последнем шаге, плюс единица. - Отсканируйте исходный набор и установите значение вашего нового логического массива с индексом, равным числу в вашем исходном наборе, равным
true
. - Наконец просканируйте ваш
boolean
массив, чтобы найти и распечатать все индексы со значением false
.
Пример:
Оригинальный набор: {1,0,3}
- Шаг 1: Максимальное количество в наборе = 3
- Шаг 2: логический массив с длиной = 3 + 1 → {ложь, ложь, ложь, ложь}
- Шаг 3: при сканировании исходного набора и значений настроек в
boolean
массиве это будет конечное состояние → {true, true, false, true} - Шаг 4: Наконец, вы просканируете
boolean
массив для печати 2, так как это только индекс, значение которого равно false
Ответ 4
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);
}
}
Ответ 5
int[] a= {0,12,14,15,32};
Arrays.sort(a);
for(int i=0;i<a.length-1;i++)
{
if(a[i+1]-a[i]>1)
{
int temp=a[i+1]-a[i];
for(int j=1;j<temp;j++)
{
System.out.print(a[i]+j + " ");
}
temp=0;
}
}
Вывод: 1 2 3 4 5 6 7 8 9 10 11 13 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31