Готовя файл для вступительного экзамена, аспирант Сидоров сделал следующее: - Заполнил случайными целыми числами массив из N элементов.
- Создал второй массив, из 2N элементов, и поместил туда элементы первого массива, каждый - в двух экземплярах.
- Программными средствами перемешал массив.
- Записал в текстовый файл все элементы второго массива, кроме последнего (по одному в строке).
Требуется по содержимому файла найти то число, которое в него не попало, т.к. было последним в массиве. Известно, что в массиве до 20000 элементов, а числа, которыми он заполнялся, не больше 10000. Опишите словесно идею алгоритма решения этой задачи. Постарайтесь предложить алгоритм, эффективный по времени и памяти.
Ответы на вопрос:
В этой задаче непонятно, могут ли числа быть отрицательными.
Предположим, что нет, т.к. указано только ограничение сверху (числа меньше или равны 10000).
Могу предложить такой алгоритм:
1. Считаем данные в массив (назовем его original).
2. Создадим еще один массив (пока заполненный нулями) на 10001 элемент (учитываем 0). Его назовем counter.
3. Будем идти по массиву original, брать каждое число и прибавлять 1 в соответствующую ячейку counter, номер которой равен текущему числу.
Пример:
Пусть в нулевой ячейке массива original лежит число 100. Тогда прибавляем 1 к значению сотой ячейки counter. В следующей ячейке original пусть лежит 135. Тогда идем в 135-ую ячейку массива counter и прибавляем 1.
4. В итоге мы будем знать, сколько каких дано элементов.
5. Надо найти у какого значения не хватает пары. "Не хватает пары" в данном случае будет означать, что в соответствующей ячейке counter будет лежать нечетное число (если числа не могут повторяться, то это будет число 1, а в остальных ячейках 2; но мы не можем быть уверены, что числа не повторяются, поэтому решим в более общем виде).
6. Поэтому пройдемся по массиву
counter, проверяя каждую ячейку на четность. Только встречаем нечетную ячейку, сразу выводим ее номер и прекращаем выполнение программы (она такая одна).
Если все-таки там могут быть отрицательные числа (а ограничение по модулю), то надо просто ввести еще один массив negative_counter (10001 ячейка). Ноль в нем надо игнорировать (уже подсчитывается в обычном counter вместе с положительными числами), а при проходе массива original делать сначала проверку на положительное/отрицательное значение и при обращении к номеру ячейки negative_counter через значение текущей ячейки original не забывать ставить минус или модуль (будет что-то вроде negative_counter[-original[i]] += 1 или negative_counter[abs(original[i])] += 1). Потом пройти два массива (по очереди) с проверкой на четность. При выводе тоже не забыть про минус, если без пары окажется отрицательное число.
Плюсы алгоритма: он линейный.
Минусы: создаем лишний массив, т.е. используем лишнюю память.
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
gnevasheva196520.12.2020 00:14
-
ЛехаФомин10.05.2022 17:13
-
России554415.06.2020 02:47
-
ВиталяАрхипов01.10.2020 04:53
-
вова96603.12.2021 18:59
-
Kolla7712.02.2020 01:29
-
Chirtulova22830.03.2020 13:04
-
amalia11006.10.2022 21:03
-
milashka4413.08.2020 01:52
-
тигр18721.07.2020 01:56
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.