Другие языки программирования и технологии

Помогите решить задачу на программирование!

ОЧЕНЬ ПРОШУ СВЕДУЩИХ В ПРОГРАММИРОВАНИИ РЕШИТЬ ДАННУЮ ЗАДАЧУ. Условие задачи из Интернета, других условий к задаче нет.Дан достаточно большой входной поток целых чисел, в которых все числа встречаются ровно 2 раза, кроме одного, которое входит только один раз.1. Нужно за конечное число проходов 0(1) потока (массива), и используя дополнительную память не более 0(1), найти его.2. То же, что в первом, только ровно два числа встречаются один раз.
Viktor Petrov
Viktor Petrov
2 213
Один вариант
Залить всё в массив, отсортировать, одинаковые числа будут рядом.

Другой вариант.
Битовый массив. Под int это займёт 4G/8 = 512M - для современных машин вполне реально. Читаем число, ставим битик, или снимаем, смотря какая задача.

Третий вариант.
Если чисел меньше чем 2^57, то можно создать хэш-таблицу, на том же объёме памяти.

Эти варианты дают один проход.
Еркин Жарылгасов
Еркин Жарылгасов
2 799
Лучший ответ
Что такое 0(1), я, честно говоря, не понял, но могу предложить алгоритм с использованием коллекции.

Первое число потока добавляем в коллекцию.
Для всех остальных чисел выполняем следующие действия:
Обходим коллекцию сначала и каждый элемент коллекции сравниваем с текущим элементом потока.

Если текущий элемент входного потока больше текущего элемента коллекции - переходим к следующему элементу коллекции (следующей итерации) .

Если текущий элемент потока равен текущему элементу коллекции - удаляем этот элемент из колекции (как парный) и выходим из цикла и запрашиваем следующий элемент потока.

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

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

В случае, если роль потока играет массив, алгоритм сведётся к двойному циклу. Внешний будет обходить элементы этого массива и играть роль потока.