Разгадайте тайну: найдите недостающие и повторяющиеся числа

Вы когда-нибудь сталкивались со сценарием, когда вам дан массив чисел и вам нужно найти в нем как недостающие, так и повторяющиеся числа? Это может оказаться настоящей загадкой, но не бойтесь! В этой статье мы рассмотрим различные методы решения этой проблемы и предоставим вам примеры кода, чтобы сделать ее предельно понятной. Итак, давайте вместе погрузимся и разгадаем тайну поиска пропущенных и повторяющихся чисел!

Метод 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

Мы изучили несколько методов поиска пропущенных и повторяющихся чисел в массиве. От подхода грубой силы до сортировки и использования хеш-таблиц каждый метод имеет свои преимущества и особенности. В зависимости от размера массива и конкретных требований вашей задачи вы можете выбрать наиболее подходящий подход.

Итак, в следующий раз, когда вы наткнетесь на массив с пропущенными и повторяющимися числами, не пугайтесь! Вооружившись этими методами и примерами кода, вы сможете уверенно разгадать загадку и произвести впечатление на коллег своими навыками решения проблем.

Помните, что практика ведет к совершенству, поэтому продолжайте оттачивать свои навыки программирования и наслаждайтесь разгадыванием этих интригующих головоломок!