Рубрики
Без рубрики

[Google интервью] Найти все номера, исчезли в массиве

🏗️ Теги компании: формулировка проблем Google с учетом массивных чисел n целых чисел. Верните массив, содержащий все целые числа в диапазоне [1, N], которые не отображаются в номерах. ✒️ Здесь, число [I] находится в диапазоне [1, n]. ⚠️strants: N.Length1.

Автор оригинала: Shubham Sayon.

🏗️ Теги компании : Google

Постановка проблемы

Дано массив Nums N целые числа. Возвращение Массив, содержащий все целые числа в диапазоне [1, n] которые не появляются в Nums Отказ ✒️ здесь, Nums [I] находится в диапазоне [1, n] Отказ

⚠️ Ограничения :

  • N.Length
  • 1 5
  • 1 [я]

💡examples.

Давайте посмотрим на некоторые примеры для улучшения нашего понимания этой проблемы.

✏️ Example 1

Input:  nums = [4,3,2,7,8,2,3,1]
Output: [5,6]
Explanation: The length of the array is 8 and the only numbers missing from it within the range 1 to 8 are '5' and '6'.

✏️ Example 2

Input:  nums = [1,1]
Output: [2]
Explanation: The length of the array is 2 and the only number missing from it within the range 1 to 2 is '2'.


✏️ Example 3

Input:  nums = [1,2,3,4,5]
Output: []
Explanation: All numbers within the range 1 to 5 are present in the array.


✏️ Example 4

Input:  [4,4,4,4]
Output: [1,2,3]
Explanation: The length of the array is 4 and the numbers missing from it within the range 1 to 4 are '1', '2' and '3'.

🖊️PYPHON ONE-LILER С помощью списка + комплект + диапазон

Подход: Идея здесь – использовать Установить в пределах Диапазон (1, Len (Nums) + 1) это позволяет вам получить Уникальный Элементы в Nums от 1 до n а затем вычесть Set (Nums) от него. Это даст вам цифры, которые не были в данном диапазоне.

Примечание:

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

Теперь давайте посмотрим на код Отказ

def missing_numbers(nums):
    return list(set(range(1, len(nums)+1))-set(nums))

Легкий! Не так ли? 😀.

Давайте запустим этот код на наших примерах:

#Example 1

nums = [4,3,2,7,8,2,3,1]
print(missing_numbers(nums))
#[5,6]


#Example 2

nums = [1,1]
print(missing_numbers(nums))
#[2]

#Example 3

nums = [1,2,3,4,5]
print(missing_numbers(nums))
#[]


#Example 4

nums = [4,4,4,4]
print(missing_numbers(nums))
#[1,2,3]

Ура! 😃 Код передал все тестовые случаи.

Анализ сложности

  • Сложность времени: Честно говоря, мы просто находим разницу между двумя наборами в этом решении. Следовательно, сложность выполнения этого решения является O (n) Отказ
  • Космическая сложность: O (n)

Но мы можем избежать использовать набор и как-то маркировать входной массив, который говорит нам, какие номера видны и что нет? Это позволит нам Избегайте использования дополнительное пространство.

Тидбит : Python Диапазон () Функция создает передачу последующих целых чисел в данном диапазоне значений. Вы можете пройти либо только Стоп аргумент, в этом случае Диапазон Объект будет включать все целые числа из 0 к Стоп (Исключенный). Или вы можете пройти Начать , Стоп и шаг Аргументы, в этом случае объект диапазона поедет из Начать к шаг Использование данного шаг размер. Например, Диапазон (3) Результаты в 0, 1, 2 и Диапазон (2, 7, 2) Результаты в 2, 4, 6 Отказ

Рекомендуемая статья: Функция Python Range () – полезное иллюстрированное руководство

🖊️Optimal Решение: без использования дополнительного пространства

Подход

Идея состоит в том, чтобы использовать данный список/массив и отслеживать посещенные номера. Поскольку все числа являются положительными целыми числами, вы можете отметить наличие каждого числа, которое посещается отрицанием числа в индексе, равном текущему номеру. Это в основном означает, что вы отмечаете индекс, равный (№ 1) Отказ Если номер в этом индексе уже отрицается, вы ничего не делаете. Наконец, просто верните индексы (индекс + 1 для числа) где числа все еще положительны и представляют недостающие номера в диапазоне.

Смущенный? Следующие иллюстрации сделают все возможное.

Объяснение:

Nums = [4, 3, 2, 7, 8, 2, 3, 1] Отказ Теперь давайте пережим через массив Nums Отказ

  • На ИТЕР ,

    • Текущий номер: | 4 | (|.. Здесь относится к принятию абсолютное значение)
    • Номер (текущий номер - 1): 7
    • После отрицания: Nums = [4, 3, 2, -7, 8, 2, 3, 1]
  • На елее

    • Текущий номер: | 3 |
    • Номер в (текущий номер - 1): 2
    • После отрицания: Nums = [4, 3, -2, -7, 8, 2, 3, 1]
  • На елее

    • Текущий номер: | -2 |
    • Номер (текущий номер - 1): 3
    • После отрицания: Nums = [4, -3, -2, -7, 8, 2, 3, 1]
  • На елее

    • Текущий номер: | -7 |
    • Номер (текущий номер - 1): 3
    • После отрицания: Nums = [4, -3, -2, -7, 8, 2, -3, 1]
  • На елее

    • Текущий номер: | 8 |
    • Номер (текущий номер - 1): 1
    • После отрицания: Nums = [4, -3, -2, -7, 8, 2, -3, -1]
  • На елее

    • Текущий номер: | 2 |
    • Номер в (текущий номер - 1): -3
    • Массив остается без изменений: Nums = [4, -3, -2, -7, 8, 2, -3, -1]
  • На елее

    • Текущий номер: | -3 |
    • Номер в (текущий номер - 1): -2
    • Массив остается без изменений: Nums = [4, -3, -2, -7, 8, 2, -3, -1]
  • На елее

    • Текущий номер: | -1 |
    • Номер в (текущий номер - 1): 4
    • После отрицания: Nums = [-4, -3, -2, -7, 8, 2, -3, -1]

Теперь индексы, на которых есть еще положительные числа, являются числами (индекс + 1) Это не было в массиве.

Давайте посмотрим на код.

def missing_numbers(nums):
    for n in nums:
        i = abs(n) - 1
        nums[i] = -abs(nums[i])
    res = []
    for i, num in enumerate(nums):
        if num > 0:
            res.append(i+1)
    return res

Тестовые случаи

Давайте пойдем вперед и выполним тестовые случаи в нашем коде, чтобы проверить подлинность этого подхода:

# Example 1
nums = [4, 3, 2, 7, 8, 2, 3, 1]
print(missing_numbers(nums))
# [5,6]


# Example 2
nums = [1, 1]
print(missing_numbers(nums))
# [2]

# Example 3
nums = [1, 2, 3, 4, 5]
print(missing_numbers(nums))
# []


# Example 4
nums = [4, 4, 4, 4]
print(missing_numbers(nums))
# [1,2,3]

Анализ сложности

  • Сложность времени: Требуется N Итерации для вычисления решения. Следовательно, сложность выполнения этого кода является O (n) Отказ
  • Космическая сложность: Это решение имеет пространственную сложность O (1) Отказ

    • Вам может быть интересно, что это не O (1) пространство, потому что вы используете res = [] Отказ Строго говоря, да, вы правы! Но, «Вы можете предположить, что возвращенный список не считается дополнительным пространством в данном вопросе». Итак, это дает вам немного свободы.

🖊️solution 3.

Есть еще один подход к решению данной проблемы.

Подход

  • Вы можете переоценить данный массив и добавить к существующему числу в позиции, подразумеваемой каждым элементом. Таким образом, позиции, подразумеваемые числами, присутствующими в массиве, будут определенно больше, чем n (то есть наименьшее число 1 и 1 + n> n).
  • Поэтому во второй итерации вам просто нужно сообщать числам, меньше или равных n, чтобы вернуть номера, которые отсутствуют в данном списке/массиве.

Давайте посмотрим на код:

def missing_numbers(nums):
    N = len(nums)
    for i in range(len(nums)):
        x = nums[i] % N
        print(nums[x-1])
        nums[x - 1] += N
    print(nums)
    x=[]
    for i in range(len(nums)):
        if nums[i] <= N:
            print(i)
            x.append(i+1)
            print(x)
    return x

Теперь давайте посмотрим на следующий пример для визуализации вышеуказанного решения. Подумайте, что данный список – Nums = [1, 3, 3] Отказ Следующие таблицы демонстрируют пошаговый сухой пробег этого списка при выполнении приведенного выше кода.

Тестовые случаи

[4, 3, 2, 7, 8, 2, 3, 1] [5, 6]
[1, 1] [2]
[1, 2, 3, 4, 5] []
[4, 4, 4, 4] [1, 2, 3]

Анализ сложности

  • Сложность времени: На)
  • Космическая сложность: O (1)

Заключение

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

Рекомендуется: Академия компьютерной науки Finxter

  • Вы хотите быстро освоить самые популярные Python IDE?
  • Этот курс приведет вас от новичка к эксперту в Пычарме в ~ 90 минут.
  • Для любого разработчика программного обеспечения имеет решающее значение для освоения IDE хорошо, писать, тестировать и отлаживать высококачественный код с небольшим усилием.

Присоединяйтесь к Pycharm MasterClass Сейчас и мастер Pycharm на завтра!

Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.

Вы можете связаться со мной @: