2016-04-15 5 views
3

Написал этот код, хотел бы получить лучший подход, используя любой алгоритм для поиска недостающих чисел из отсортированного или несортированного массива. Если его несортированный массив, я бы сортировал и выполнял следующее.Поиск недостающих чисел из массива

private static void identifyMissingValues(Integer[] ar) { 

     for(int i = 0; i < (ar.length - 1); i++) { 

      int next = ar[i + 1]; 
      int current = ar[i]; 
      if((next - current) > 1) { 
       System.out.println("Missing Value : " + (current + 1)); 
      } 
     } 
    } 

Любой код быстрее или лучше этого, пожалуйста, предложите.

+0

, если есть только один номер отсутствует в последовательности, вы можете суммировать все nubers у вас есть, просуммировать всю ожидаемую последовательность, а затем вычесть одну сумму из другой, чтобы получить недостающее номер – SimY4

+0

если там две или более пропущенных строк только первая будет напечатана – Rustam

ответ

0

Могу ли я узнать количество входных и ожидаемых выходных номеров?
Согласно вашему коду, я чувствую, что серия должна быть разницей в 1, если я не ошибаюсь.

+1

Это не ответ. Он должен быть опубликован как комментарий. –

+0

@ EdgarRokyan У меня недостаточно очков, чтобы оставить комментарий. – Pavan

0

Итак, у вас есть массив из n элементов, который начинается с целого числа i и содержит все целые числа от i до i + n, это так? Например:

arr = [1,2,3,4,5] 

Таким образом, сумма всех чисел в массиве должна быть суммой чисел от i до i + n.

Например: sum(arr) = 1+2+3+4+5 = 15

Формула для суммы чисел от 1 до п n(n+1)/2

Таким образом, вы можете иметь цикл как:

int counter = 0; 

for(Integer i : integers) 
    counter += i 

Чтобы получить сумму чисел в ваш массив.

Если ваш массив начинается с одного, вы проверяете, является ли переменная counter равной n(n+1)/2, где n - это длина вашего массива.

Если ваш массив не начинается с одного, например arr = [78, 79, 80, 81], вам нужно немного подправить этот подход, но я уверен, что вы можете это понять.

+1

Как этот алгоритм говорит вам, какие числа отсутствуют? (если только не осталось только одного номера, что, похоже, не так, на основе кода в вопросе). – Eran

1

Сортировка массива займет O(n*log(n)).

Вы можете сделать лучше, если вы добавите все элементы массива в HashSet(O(n)) времени выполнения, а затем проверить для каждого номера между 0 и ar.length - 1 (или любой другой соответствующий диапазон есть) HashSet, содержит ли это число. Это займет O(n) раз.

+0

Но зачем вам это сортировать? – MrD

+1

@MrD Я бы не хотел сортировать его - там OP делает ('Если его несортированный массив, я бы сортировал и выполнял следующее. '). Вот почему я предложил альтернативу, которая не требует сортировки. – Eran

+0

@Eran Использование HashSet I.e сложность времени (O (n)) всегда лучше выполняется для большего набора данных. правильно? – srikanth

0

Вы можете сделать:

Set<Integer> mySet = new TreeSet<Integer>(Arrays.asList(ar)); 
int min = mySet.first(); 

for (int i = 0; i < mySet.size(); i++) { 
    int number = min + i; 
    if (!mySet.contains(number)) { 
     System.out.println ("Missing: " + number); 
     i--; 
    } 
} 
2

Любой код быстрее или лучше, чем это, пожалуйста, предложите.

Нет нет такой вещи, - вы не можете улучшить на O(n) алгоритма, если необходимо посетить каждый элемент.

+0

Можно ли переписать код любым другим способом, кроме O (n), чтобы найти несколько отсутствующих значений? – srikanth

+0

@srikanth - Да, но это будет менее эффективно. – OldCurmudgeon

0

Ваш подход хорош, но я добавил что-то большее для более чем одного номера.

eg : ar={1,2,4,6,10} // Sorted Array 

private static void identifyMissingValues(Integer[] ar) { 
    for (int i = 0; i < (ar.length - 1); i++) { 
     int next = ar[i + 1]; 
     int current = ar[i]; 
     if ((next - current) > 1) { 
      for (int ind = 1; ind < next - current; ind++) 
       System.out.println("Missing Value : " + (current + ind)); 
     } 
    } 
} 

Выход,

Missing Value : 3 
Missing Value : 5 
Missing Value : 7 
Missing Value : 8 
Missing Value : 9 
+0

Выход должен быть '3 5 7 8 9'. – saka1029

+0

Да, вы правы, но код правильный. –

0
Integer [] list = new Integer[]{1, 12, 85, 6, 10}; 


Integer previous = null; 


Arrays.sort(list); 

System.out.println(list); 


for(int index = 0; index < list.length; index++){ 


    if(previous == null){ 
     previous = (Integer) list[index]; 
     continue; 
    } 

    Integer next = previous + 1; 
    if(((Integer) list[index] - previous) > 1){ 

     System.out.println("Missing value " + next); 
     index--; 

    } 
    previous = next; 


} 
2

Использование BitSet вместо сортировки.

int[] ar = {7, 2, 6, 8, 10, 4, 3, 2}; 
    int min = IntStream.of(ar).min().getAsInt(); 
    BitSet b = new BitSet(); 
    for (int i : ar) 
     b.set(i - min); 
    int i = 0; 
    while ((i = b.nextClearBit(i + 1)) < b.length()) 
     System.out.println(i + min); 

результат

5 
9 
Смежные вопросы