вопрос по массиву и числу - PullRequest
0 голосов
/ 17 июня 2010

у меня одна проблема например у нас есть массив

int a[]=new int[]{a1,a2,a3,a4,..........an}:

Задача - заполнить один и тот же массив элементами, которых нет в массиве. например a={1,3,4,5,6,7} должен быть заполнен любыми числами {2,8,9,12,13,90} или другими, но не элементами, которые находятся в массиве, это не должно быть {1,12,13,14,110}, потому что 1 находится в массиве a спасибо

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Интересная проблема.

Если массив состоит из целых чисел со знаком, я полагаю, что это возможно во времени O (n) и в пространстве O (1), без переполнений, при условии, что длина достаточно мала, чтобы это могло произойти.

Основная идея заключается в следующем:

У нас есть n номеров. Теперь, разделив эти числа на n + 1, мы получим n остатков. Таким образом, по крайней мере один из остатков в {0,1,2, ..., n} должен отсутствовать (скажем, г). Мы заполняем массив числами, остатки которых равны r.

Сначала мы добавляем кратное n + 1 ко всем отрицательным числам, чтобы сделать их положительными.

Далее мы проходим массив и находим остаток каждого числа с помощью n + 1. Если остаток равен r, мы устанавливаем a [r] равным -a [r], если a [r] был положительным. (Если мы встречаем отрицательные числа при ходьбе, мы используем отрицательную версию при взятии остатка).

У нас также есть дополнительный int для остаток = n.

В конце мы снова обходим массив, чтобы увидеть, есть ли какие-либо положительные числа (будет одно, или дополнительное значение int для остаток = n будет не установлено).

Как только у нас есть остаток, легко сгенерировать n чисел с этим остатком. Конечно, мы всегда можем сгенерировать только одно число и заполнить его этим, поскольку проблема никогда не говорила об уникальных числах.

Если бы массив состоял из целых чисел без знака, мы могли бы , вероятно, , по-прежнему делать это с лучшим ведением учета.

Например, мы могли бы попытаться использовать первые целые числа n / logn в качестве нашего битового массива, чтобы указать, какие остатки были замечены, и использовать некоторые дополнительные целые числа O (1) для временного хранения чисел.

Например, вы делаете tmp = a [0], находите остаток и устанавливаете соответствующий бит [0] (предварительно установив его в ноль). tmp = a [1], установить бит и т. д. Мы никогда не будем перезаписывать число до того, как оно нам понадобится, чтобы найти его остаток.

0 голосов
/ 17 июня 2010

Просто получите наибольшее и наименьшее число в массиве, создайте новый массив с элементами от значения нижней границы до n.

Получение наибольшего и наименьшего числа можно выполнить в одном цикле.

Если предположить 12,4,3,5,7,8,89, он обнаружит 3 как самое низкое, 89 как самое высокое значение.Затем он создает новый массив и заполняет его 3..89;затем отбросьте старый массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...