Вы когда-нибудь сталкивались со сценарием, когда вам дан массив чисел и вам нужно найти в нем как недостающие, так и повторяющиеся числа? Это может оказаться настоящей загадкой, но не бойтесь! В этой статье мы рассмотрим различные методы решения этой проблемы и предоставим вам примеры кода, чтобы сделать ее предельно понятной. Итак, давайте вместе погрузимся и разгадаем тайну поиска пропущенных и повторяющихся чисел!
Метод 1: метод грубой силы
Метод грубой силы включает в себя перебор массива и проверку вхождения каждого числа. Чтобы найти недостающее число, мы поддерживаем отдельный логический массив, чтобы отметить присутствие каждого числа. Для каждого числа, встречающегося в исходном массиве, мы отмечаем соответствующий индекс в логическом массиве. Наконец, мы перебираем логический массив, чтобы найти недостающие числа и повторяющиеся числа.
def find_missing_and_repeating_numbers_brute_force(arr):
n = len(arr)
seen = [False] * (n + 1)
missing_number = None
repeating_number = None
for num in arr:
if seen[num]:
repeating_number = num
seen[num] = True
for i in range(1, n + 1):
if not seen[i]:
missing_number = i
return missing_number, repeating_number
Метод 2: сортировка массива
Другой подход предполагает сортировку массива и последующее перебор его для поиска пропущенных и повторяющихся чисел. Сравнивая соседние элементы, мы можем легко определить повторяющееся число. Недостающее число можно найти, наблюдая за разницей между последовательными элементами.
def find_missing_and_repeating_numbers_sort(arr):
arr.sort()
missing_number = None
repeating_number = None
for i in range(len(arr) - 1):
if arr[i] == arr[i + 1]:
repeating_number = arr[i]
break
for i in range(len(arr) - 1):
if arr[i + 1] - arr[i] > 1:
missing_number = arr[i] + 1
return missing_number, repeating_number
Метод 3: использование хеш-таблиц
Мы можем использовать хеш-таблицу (словарь на Python) для эффективного поиска пропущенных и повторяющихся чисел. Перебирая массив, мы можем отслеживать частоту каждого числа. Число с частотой больше 1 является повторяющимся числом, а пропущенное число будет иметь частоту 0.
def find_missing_and_repeating_numbers_hash(arr):
frequency = {}
missing_number = None
repeating_number = None
for num in arr:
if num in frequency:
repeating_number = num
frequency[num] = frequency.get(num, 0) + 1
for i in range(1, len(arr) + 1):
if frequency.get(i, 0) == 0:
missing_number = i
return missing_number, repeating_number
Метод 4: использование математики
В этом подходе используются формулы суммы и суммы квадратов для поиска пропущенных и повторяющихся чисел. Вычислив ожидаемую сумму и сумму квадратов, мы можем найти недостающее число, вычитая фактическую сумму из ожидаемой суммы. Точно так же повторяющееся число можно найти, вычитая фактическую сумму квадратов из ожидаемой суммы квадратов.
def find_missing_and_repeating_numbers_math(arr):
n = len(arr)
expected_sum = (n * (n + 1)) // 2
expected_sum_squares = (n * (n + 1) * (2 * n + 1)) // 6
actual_sum = sum(arr)
actual_sum_squares = sum(x * x for x in arr)
missing_number = expected_sum - actual_sum
repeating_number = (expected_sum_squares - actual_sum_squares) // missing_number
return missing_number, repeating_number
Мы изучили несколько методов поиска пропущенных и повторяющихся чисел в массиве. От подхода грубой силы до сортировки и использования хеш-таблиц каждый метод имеет свои преимущества и особенности. В зависимости от размера массива и конкретных требований вашей задачи вы можете выбрать наиболее подходящий подход.
Итак, в следующий раз, когда вы наткнетесь на массив с пропущенными и повторяющимися числами, не пугайтесь! Вооружившись этими методами и примерами кода, вы сможете уверенно разгадать загадку и произвести впечатление на коллег своими навыками решения проблем.
Помните, что практика ведет к совершенству, поэтому продолжайте оттачивать свои навыки программирования и наслаждайтесь разгадыванием этих интригующих головоломок!