Другие языки программирования и технологии
Помогите решить задачу на программирование!
ОЧЕНЬ ПРОШУ СВЕДУЩИХ В ПРОГРАММИРОВАНИИ РЕШИТЬ ДАННУЮ ЗАДАЧУ. Условие задачи из Интернета, других условий к задаче нет.Дан достаточно большой входной поток целых чисел, в которых все числа встречаются ровно 2 раза, кроме одного, которое входит только один раз.1. Нужно за конечное число проходов 0(1) потока (массива), и используя дополнительную память не более 0(1), найти его.2. То же, что в первом, только ровно два числа встречаются один раз.
Один вариант
Залить всё в массив, отсортировать, одинаковые числа будут рядом.
Другой вариант.
Битовый массив. Под int это займёт 4G/8 = 512M - для современных машин вполне реально. Читаем число, ставим битик, или снимаем, смотря какая задача.
Третий вариант.
Если чисел меньше чем 2^57, то можно создать хэш-таблицу, на том же объёме памяти.
Эти варианты дают один проход.
Залить всё в массив, отсортировать, одинаковые числа будут рядом.
Другой вариант.
Битовый массив. Под int это займёт 4G/8 = 512M - для современных машин вполне реально. Читаем число, ставим битик, или снимаем, смотря какая задача.
Третий вариант.
Если чисел меньше чем 2^57, то можно создать хэш-таблицу, на том же объёме памяти.
Эти варианты дают один проход.
Что такое 0(1), я, честно говоря, не понял, но могу предложить алгоритм с использованием коллекции.
Первое число потока добавляем в коллекцию.
Для всех остальных чисел выполняем следующие действия:
Обходим коллекцию сначала и каждый элемент коллекции сравниваем с текущим элементом потока.
Если текущий элемент входного потока больше текущего элемента коллекции - переходим к следующему элементу коллекции (следующей итерации) .
Если текущий элемент потока равен текущему элементу коллекции - удаляем этот элемент из колекции (как парный) и выходим из цикла и запрашиваем следующий элемент потока.
Если текущий элемент коллекции больше текущего элемента потока - вставляем текущий элемент потока в коллекцию, перед текущим элементом коллекции (это важно) , обрываем цикл и переходим к следующему элементу потока.
Учитывая, что парные числа будут удаляться из коллекции в процессе прохожденя потока - дополнительная память сильно не разрастётся. В конце концов в колекции останутся только непарные элементы (сколько бы их ни было) .
Единственная оговорка: если какое-то число в потоке попадётся более двух раз, то вопрос о том, останется оно в коллекции или нет будет зависеть от чётности количества таких чисел в потоке.
В случае, если роль потока играет массив, алгоритм сведётся к двойному циклу. Внешний будет обходить элементы этого массива и играть роль потока.
Первое число потока добавляем в коллекцию.
Для всех остальных чисел выполняем следующие действия:
Обходим коллекцию сначала и каждый элемент коллекции сравниваем с текущим элементом потока.
Если текущий элемент входного потока больше текущего элемента коллекции - переходим к следующему элементу коллекции (следующей итерации) .
Если текущий элемент потока равен текущему элементу коллекции - удаляем этот элемент из колекции (как парный) и выходим из цикла и запрашиваем следующий элемент потока.
Если текущий элемент коллекции больше текущего элемента потока - вставляем текущий элемент потока в коллекцию, перед текущим элементом коллекции (это важно) , обрываем цикл и переходим к следующему элементу потока.
Учитывая, что парные числа будут удаляться из коллекции в процессе прохожденя потока - дополнительная память сильно не разрастётся. В конце концов в колекции останутся только непарные элементы (сколько бы их ни было) .
Единственная оговорка: если какое-то число в потоке попадётся более двух раз, то вопрос о том, останется оно в коллекции или нет будет зависеть от чётности количества таких чисел в потоке.
В случае, если роль потока играет массив, алгоритм сведётся к двойному циклу. Внешний будет обходить элементы этого массива и играть роль потока.
Похожие вопросы
- Помогите решить) Задачи по программированию в Паскале
- помогите решить задачу по программированию
- Помогите решить задачи по программированию!!!
- Помогите решить задачу по программированию! Язык - Visual Basic.
- помогите решить задачи по программированию в ПАСКАЛЕ!!!
- Помогите решить задачу по программированию. Дано четырёхзначное число. Найти: а) сумму его цифр; б) произведение его циф
- Помогите решить задачу по программированию, пожалуйста. Найти сумму наименьших значений элементов строк. (вложенные циклы)
- Помогите решить задачу по Программированию в паскале.
- Помогите решить задачу по программированию
- Помогите пожалуйста решить задачу по программированию. В чем я ошибаюсь?