Автор оригинала: Robin Andrews.
Эта статья о классической задаче, которая часто приводится в Питоновые кодировки интервью. Есть несколько разных подходов, которые вы могли бы взять, но цель – придумать решение, которое имеет «разумное» Сложность времени – I.e. Учитывая большой вход, он завершится в течение нескольких секунд, а не часами …
Учитывая несортированный список целых чисел, найдите пару, которая добавляет до заданного значения. Определите индексы значений, которые сумма для цели. Эти показатели должны быть различными (то есть. Вы не можете использовать значение в той же положении дважды).
Например:
вход [1, 2, 3], 4
должен дать выход (0, 2)
Почему бы не пойти на кодировку решения самостоятельно?
Чтобы сосредоточить внимание на желаемом исходе этой проблемы, очень хорошая идея написать некоторые основные тесты, или, по крайней мере, рассмотреть конкретный пример, и быть понятным о том, что вы ожидаете, что вывод будет.
Тестирование Это большая тема, и мы не будем здесь много подробно, но, чтобы дать вам голову, я предоставим некоторые очень базовые тесты в виде Python Assert заявления. Если вы новичок в утверждении утверждения, они просто простой способ проверить свой код – когда это правильно, ничего не произойдет, что это хорошо, но если утверждение не соответствует действительности, вы получите AssertionError Отказ Если это не понятно, и вы предпочли бы не использовать Assert, вы можете удалить эти операторы и просто использовать оператор печати. Например. Печать (Sum_of_squares (10)).
Имея в виду, вот некоторые функциональные заглушки и несколько тестов, чтобы начать:
# 2-Sum Interview Problem
def two_sum_problem(arr, target):
pass
assert two_sum_problem([1, 2, 3], 4) == (0, 2)
assert two_sum_problem([1234, 5678, 9012], 14690) == (1, 2)
assert two_sum_problem([2, 2, 3], 4) in [(0, 1), (1, 0)]
assert two_sum_problem([2, 2], 4) in [(0, 1), (1, 0)]
assert two_sum_problem([8, 7, 2, 5, 3, 1], 10) in [(0, 2), (2, 0), (1, 4), (4, 1)]
Причина, по которой некоторые из этих утверждений имеют несколько возможных значений, заключается в том, что мы не определили порядок, в котором функция проверит пары кандидатов, поэтому нам нужно объяснить более одного возможного решения, в том числе, когда оба кандидата имеют одинаковое значение (они не может иметь такой же индекс по определению проблемы).
Python Программирование Проблема собеседования Две сумму – наивный подход
Как вы решите решить эту проблему, будет зависеть от вашего уровня опыта. Один подход – соблюдать переключение списка и для каждого элемента, чтобы сравнить его со всеми остальными элементами в списке.
Хотя этот подход очень неэффективен, из-за количества вовлеченных сопоставлений (у него есть O (n ^ 2) Сложность времени), все еще стоит реализовать его так, как это даст вам возможность полностью понять задачу и почувствовать, что нужно.
Вот заглушка и некоторые тесты на наивный подход. Идите для себя, прежде чем смотреть на мое решение.
def two_sum_problem_brute_force(arr, target):
pass
assert two_sum_brute_force([1, 2, 3], 4) == (0, 2)
assert two_sum_brute_force([1234, 5678, 9012], 14690) == (1, 2)
assert two_sum_brute_force([2, 2, 3], 4) in [(0, 1), (1, 0)]
assert two_sum_brute_force([2, 2], 4) in [(0, 1), (1, 0)]
assert two_sum_brute_force([8, 7, 2, 5, 3, 1], 10) in [(0, 2), (2, 0), (1, 4), (4, 1)]
# Two Sum Interview Problem
# Brute force approach
def two_sum_brute_force(arr, target):
length = len(arr)
for i in range(length - 1):
for j in range(1, length):
# print(i, j)
if arr[i] + arr[j] == target:
return i, j
return None
Вы должны держать вас от утверждений, и если код не работает без ошибок, вы можете быть достаточно уверенно, ваше решение правильное, хотя вы вполне можете захотеть написать еще несколько тестов, включая проверку краевые чехлы Отказ
Улучшенное решение для проблемы собеседования 2 суммы с использованием двоичного поиска
Целью интервьюера при задании этого вопроса вполне может быть ощущение вашего общего подхода к решению проблем, но и посмотреть, знают ли знать о «большой» проблемы с наивным подходом (его радикальная неэффективность для любого большого ввода) И насколько хорошо вы можете применить свои знания алгоритмов, чтобы придумать более эффективное решение.
Один из подходов, который может произвести впечатление на ваш интервьюер, состоит в том, чтобы пойти по дороге сортировки ввода сначала и посмотреть, где это приведет вас. Сортировка является относительно недорогой операцией, при условии, что используется хороший алгоритм, поэтому, если мы сможем улучшить на тех вложенных для Петли, делая это, то мы должны.
Оказывается, что это обеспечивает аккуратный раствор двух суммой проблемы: мы можем отсортировать наши данные, а затем использовать алгоритм двоичного поиска, чтобы найти дополнение к текущему значению для решения проблемы.
Например, если текущее значение, поскольку мы петлю через наш вход, это 11 И целевое значение равно 20, мы используем двоичные поиски, чтобы найти значение 9 на входе. Если это там, мы сделаем. Нам нужно быть осторожным, хотя, что мы исключаем текущее значение из поиска как проблема требует, чтобы мы не можем использовать тот же элемент ввода дважды, чтобы сформировать нашу сумму.
Код для этого улучшенного решения ниже:
# Binary Search Solution to Two Sum Interview Problem
def binary_search(lst, target):
low = 0
high = len(lst) - 1
while low <= high:
mid = (low + high) // 2
if lst[mid] == target:
return mid
elif lst[mid] > target:
high = mid - 1
else:
low = mid + 1
return None
def two_sum_binary_search(arr, total):
length = len(arr)
arr = sorted(arr)
for i in range(length):
complement = total - arr[i]
complement_idx = binary_search(arr, complement)
# print(f"comliment: {complement} idx: {complement_idx}")
if complement_idx is not None: # Found solution!
if complement_idx != i:
return (i, complement_idx)
return None
assert two_sum_binary_search([2, 2], 4) in [(0, 1), (1, 0)]
print(two_sum_binary_search([8, 7, 2, 5, 3, 1], 10)) # Sorted!!
assert two_sum_binary_search([8, 7, 2, 5, 3, 1], 10) in [(2, 4), (4, 2), (1, 5), (5, 1)]
Пара утверждений снабжена этим решением. Обратите внимание, что с этой версией тесты должны быть основаны на отсортированном массиве.
Раствор хеш-таблица для Python Два суммы Проблема собеседования
Подход, который, скорее всего, впечатлит вашего интервьюера, должен использовать хеш-таблица Отказ В Python это вообще просто означает использование Словарь Отказ Основная идея заключается в том, что мы зацикливаем наш вход, глядя на комплимент текущего значения ( Target - Current_Value ) в хэш-таблице. Если это найдено, мы сделаем. В противном случае мы храним значения в хэш-таблице вместе с индексами, где были найдены эти значения.
Ключевое наблюдение: Хэш Столовые магазины Значение: индекс Пары с текущим входным значением в качестве ключа и индекс в качестве записи для этой клавиши.
Вот в списке кода для решения на основе хеш-таблица на двух сумму проблема собеседования в Python. В качестве хэш-таблиц, как правило, очень эффективные структуры данных для выполнения поиска, это решение очень экономично (в основном O (n) Сложность времени).
В зависимости от вашего уровня опыта, вы можете попробовать реализовать решение для себя, поэтому я скрою свой код – вы можете показать это, нажав Показать решение ниже. Вот заглушка и некоторые тесты, чтобы вы начали.
def two_sum_hash_table(arr, total):
pass
assert two_sum_hash_table([1, 2, 3], 4) in [(0, 2), (2, 0)]
assert two_sum_hash_table([1234, 5678, 9012], 14690) in [(1, 2), (2, 1)]
assert two_sum_hash_table([2, 2, 3], 4) in [(0, 1), (1, 0)]
assert two_sum_hash_table([2, 2], 4) in [(0, 1), (1, 0)]
assert two_sum_hash_table([8, 7, 2, 5, 3, 1], 10) in [(0, 2), (2, 0), (1, 4), (4, 1)]
def two_sum_hash_table(arr, total):
hash_table = dict()
for i in range(len(arr)):
complement = total - arr[i]
if complement in hash_table:
return (i, hash_table[complement])
else:
hash_table[arr[i]] = i
return None
assert two_sum_hash_table([1, 2, 3], 4) in [(0, 2), (2, 0)]
assert two_sum_hash_table([1234, 5678, 9012], 14690) in [(1, 2), (2, 1)]
assert two_sum_hash_table([2, 2, 3], 4) in [(0, 1), (1, 0)] # order!
assert two_sum_hash_table([2, 2], 4) in [(0, 1), (1, 0)]
assert two_sum_hash_table([8, 7, 2, 5, 3, 1], 10) in [(0, 2), (2, 0), (1, 4), (4, 1)]
Мы охватываем три подхода к проблемам из двух сумму с использованием Python в этой статье. Я надеюсь, что вы нашли это полезным. Дайте мне знать в комментариях, если вы сделали.
Счастливые вычисления!