Реальная задача из собеседования. Почему я до сих пор Junior программист в Python. Эпизод 4

preview_player
Показать описание
Небольшая серия видеороликов, которая показывает на простых задачах, в чем отличается код, написанный Senior и Junior специалистом Python.

Эпизод четвертый

0:00 Введение
02:17 Junior решение
08:15 Вроде Senior решение
10:03 Senior решение
12:40 Бенчмарки

#python #programming #xor
Рекомендации по теме
Комментарии
Автор

Где ты раньше был? Обожаю твой канал!
Пока остальные делают видео про computer science и прочие сложные вещи, ты рассказываешь про интересные фишки в лёгких вещах

dispondi
Автор

С XOR гениально! Плохо что битовые операции только мельком пробегают на разных курсах.
Вообще битовые операции можно применять где угодно, да просто сложить два числа, или в степень возвести, корень извлечь.
Но обычно мимо битовых операции проходят как около чего то ненужного, типа пережиток прошлого и низкоуровневого программирования. А оно вот как тут прекрасно показано его преимущество)))

felsliz
Автор

Вероятно многие не поняли последнее решение, потому что автор преподнес это как нечто сверхъестественное.

Объясняю простым языком: операция XOR двух одинаковых чисел даёт 0. Что нам это даёт? А то, что если в массиве у каждого элемента есть пара и только у одного нет, то мы можем перексорить все элементы массива, что собственно и сделано в алгоритме, и в итоге все парные числа превратятся в ноль, а непарное останется. Причем не важно, в каком порядке они находятся в массиве.

Если до сих пор не понятно, как работает эта операция, можно с помощью bin(какое-нибудь число) переводить числа в двоичный код и смотреть, как получается эта "магия"

night_niker
Автор

Эту задачу можно решить и для двух непарных чисел. Находишь С = A xor B, у этого значения будет хотя бы один единичный бит, и вторым циклом можно поксорить только числа с этим единичным битом. Получили число А, потом из него получили B = C xor A

alexandroppolus
Автор

Мне почему то сразу filter пришел в голову...
print(*filter(lambda x: a.count(x) == 1, a))

Dr._S_Brule
Автор

sort(ls)
for i in range(0, len(ls) - 1, 2):
if(ls[i] != ls[i+1]):
return ls[i]
if ls[-2] != ls[-1]:
return ls[-1]

johng
Автор

Не особо знаком с python да и сам low jun, но сделал за пару минут такое решение. Было бы интересно увидеть его производительность 🤔
for i in range(len(ls)):
if ls.count(ls[i]) % 2 != 0:
print(f'Wrong num: {ls[i]}')

usrbad
Автор

подсказка про типы данных шикарна, сразу догнал. если с мк не работали люди могут и не понять

MrLagger
Автор

Спасибо за видео. Не совсем понял как работает ксор опперация, видно я еще даже не джуниор, а скорее бейби 😅, хотя курс по Питону закончил. Специально пересмотрел все конспекты, но объяснения о ксор опперации так и не нашел. Или пропустил, или преподаватель пропустил

Maksimasz
Автор

Для CPython чуть быстрее и в одну строку functools.reduce(operator.xor, list) Для pypy быстрее вариант в ролике

dzh
Автор

спасибо за видео!не подскажите в есть ли еще функции, в которых можно использовать key=?(помимо sort и sorted?)

nicky-zn
Автор

даначнется конкурс чей питон короче.

from collections import Counter

print(min(Counter(ls).items(), key=lambda x: x[1])[0])

bxzejwp
Автор

Код по генерации тестовых данных выглядит неоптимизированным. Зачем там использовать sorted, если потом лист все равно перемешивается. Можно избежать и инструкции del, если первый range сделать до 10_000_000, а второй до 9_999_999. Вариант с хоr хороший, но читается хуже второго варианта. Есть еще вариант с Counter, перебираем до первого элемента, у которого counter равен 1.

_balancy_
Автор

Решение очень красивое, но чисто на знание, как и множество задач с собесов к сожалению.
Я хоть и хорошо знаком с логическими операциями, но применить XOR для решения подобной задачи едва ли пришло бы в голову. Фишка из области низкоуровнего программирования, совсем не в стиле Python, хотя без сомнения рабочая. Чисто олимпиадная тема, практическое применение данного фокуса крайне ограничено. Автор видео скорее всего тоже решение где-то подсмотрел ;)

gobpblueex
Автор

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

doraty_
Автор

Я бы в словарь складывал и там бы искал нечётные количества.

maximarbuzov
Автор

Мне почему то сразу группировка со словарем в голову пришла. Defult dict

sergeysergey
Автор

list = [1, 2, 1, 2, 3]
number = min([list.count(el) for el in list.set()])

qvzpuiq
Автор

Я не смотрел решение. Я не программист, я сдаю ЕГЭ + решаю простенькие задачки с codeforces. Мне пришлов голову несколько решений но самое креативное - создать множество из списка, а список с помощью join (конкатенация занимает намного больше времени 'кста хз почему') перевести в строку, а после с помощью цикла перебирать значения из множества и функцией count узнавать сколько повторяющихся символов в строке. ' Такое себе решение, но должно сработать за О(n) + креативное'.

plbseor
Автор

я еще даже не джун наверное, я сделал через цикл фор, если ls.count(i) == 1 то притую

nparadsepwnz