Viktor
глянем.
Viktor
Andrey
Задачу, кстати, так и не смог найти на литкоде. Нужно было найти в массиве пару, дающую минимальное произведение. За N^2 очевидно, за нормальное время я не могу придумать лаконичного решения. То, что мне удалось подсунуть на интервью, не так и не получилось заставить работать.
Andrey
Viktor
Viktor
нормально так ты продал.
Andrey
def find_min_prod_opt(lst: List[int]):
if len(lst) < 2:
raise ValueError("Empty list")
a, b = lst[0], lst[1]
current_min = a * b
for x in lst[2:]:
prod_a = a * x
prod_b = b * x
prod_min = min(prod_a, prod_b)
current_min = min(prod_min, current_min)
return current_min
Andrey
Это решение может давать правильный результат на некоторых данных :)
Viktor
Andrey
Отрицательные тоже, в этом и проблема
Andrey
def find_min_prod_opt(lst: List[int]):
if len(lst) < 2:
raise ValueError("Empty list")
a, b = lst[0], lst[1]
current_min = a * b
for x in lst[2:]:
prod_a = a * x
prod_b = b * x
prod_min = min(prod_a, prod_b)
current_min = min(prod_min, current_min)
return current_min
На [1, 2, 3, 4] все ок, c [1, 2, 3, -4] уже беда
Viktor
Viktor
Ilia
Viktor
Ilia
Ilia
И сохранять максимальные отрицательные
Viktor
похоже, что есть действительно две ситуации, которые надо отдельно обработать. и там и там линия.
Ilia
Первое проверить что есть положительные числа или все отрицательные
Ilia
Второе найти нужное
Ilia
А, ну все равно два прохода
Andrey
Andrey
Вот так будет правильно, но медленно:
data = [1,2,3,-4]
result = min([a * b for a, b in itertools.combinations(data,2)])
Ilia
Дальше вилка условий
Ilia
Если есть, то ищешь максимальное положительные и минимальное отрицательное
Ilia
Если нет, то два максимальных отрицательных дадут минимальное положительное при перемножении
Andrey
Да, теперь понятно. Но это будет прям много ветвлений, и как-то некрасиво выходит. Но принцип понятен
Ilia
Зато О(N) :)
Andrey
Кстати, а что вы думаете насчет видеозаписи интервью кандидатом? Например, для разбора своих ошибок потом. Многие ли компании дадут согласие?
Yuri
Ilia
Ivan
Ivan
Потому что негромоздил такого😱 Даже optional применил (писал на плюсах)
Ivan
Но зато линия в один проход!
Ivan
Когда есть желание написать за линию в один проход, нужно грамотно выбрать, какие преобразования от просматриваемых текущих переменных будешь сохранять. Для этого нужно уловить все кейсы. Возможно, деление будет избыточным, и некоторые из них желательно объединить. У меня деление на кейсы было избыточным + я изначально выбрал не лучший вариант сбора различной инфы во время цикла. В итоге тело цикла получилось в виде нагромождения if-ов. Лучше на это не смотреть.
Andrey
Andrey
Andrey
Я уверен, что такая открытость была бы только на руку hr-бренду компании
Ilia
А почему не согласился бы в большой?
Риск раскрытия стандартов собеседования и риск того, что ко мне придут потом и спросят: а с хера ли? :)
У нас итак в компанию невысокий уровень знаний нужен на полкозули, так если это ещё и гроккать начнут, то совсем повеситься можно будет он оверпрайснутых людей
Ivan
Alex Azarov
https://arxiv.org/pdf/2110.01111.pdf
Abstract
We present an extremely simple sorting algorithm. It may look like it is obviously wrong, but we prove that it is in fact correct. We compare it with other simple sorting algorithms, and analyse some of its curious properties.
Viktor
V
а где вы натыкаетесь на такие статьи?
Alex Azarov
V
а вы читаете что-то на сабстеке?
Alex Azarov
https://blog.pragmaticengineer.com/
Не совсем сабстэк но интересно
Alex Azarov
А хотя стоп, у него как раз на сабстэке подписка
V
Порридж В Ко-ливинге
Alex Azarov
Вот ещё интересный блог, чел в 2006 году писал про стартапы хотя тогда даже айфонов не было
http://www.paulgraham.com/mit.html
V
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Порридж В Ко-ливинге
def find_min_prod_opt(lst: List[int]):
if len(lst) < 2:
raise ValueError("Empty list")
a, b = lst[0], lst[1]
current_min = a * b
for x in lst[2:]:
prod_a = a * x
prod_b = b * x
prod_min = min(prod_a, prod_b)
current_min = min(prod_min, current_min)
return current_min
Вообще судя по коду кажется дыже банальные тесты не проходит. Вроде бы надо просто найти 4 числа и перемнодить их, вот алгоритм:
(0) Если меньше 2ух элементов, то вывести ошибку
(1) Найти наибольшее по модулю отрицательное умножить на наибольшее по модулю положительное
(2) найти перемножить 2 наименьших по модулю числа
(3) Найти наименьшее среди выше перечисленных
Почему работает? У нас 4 сценария:
1. Элементов меньше 2ух, сработает часть алгоритма (0)
2. Все положительные или отрицательные, произведение всегда положительное, нужно минимальное число, сработает часть алгоритма (2)
3. Есть положительные и отрицательные, значит наим возможное число будет отрицательным, сработает часть алгоритма (1)
Viktor
Порридж В Ко-ливинге
TheHesoyam
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Хантят всей страной 🤣
Anonymous
Подскажите, пожалуйста, как такую функцию сделать можно?
Чтобы можно было подписаться на on и если выполнилось что-то внутри функции, мы попадали в ‘hash’, если что-то ещё, то в receipt, если же ошибка, то в error. Я так понимаю, что это как-т она промисах можно реализовать?
send()
.on('hash', (hash) => {
})
.on('receipt', (receipt) => {
})
.on('error', (error) => {
});
Lynn «Кофеман»
Промисы вообще мимо. Это Event Emitter https://nodejs.org/api/events.html
Lynn «Кофеман»
Паттерн не специфичен для ноды, но в ней используется повсеместно.
Anonymous
а на фронте как? и может есть пример?
Viktor
а на фронте как? и может есть пример?
мне кажется вот один-в-один интерфейс, который тебе нужен — https://github.com/developit/mitt , можно там реализацию почитать и взять себе. ну или всю библиотеку, если тебе не обязательно это реализовывать самому.
Anonymous
спасибо, посмотрю
Viktor
спасибо, посмотрю
а какой контекст вопроса, это какая-то реальная задача или собес?
Viktor
просто это один из классических вопросов для собеседований, потому что там 100 строк кода и она прекрасно укладывается в формат интервью.
Anonymous
не совсем подошёл пакет mitt на сколько я понял.
У меня просто есть логика в проекте завязанная на вызов web3 контракта https://web3js.readthedocs.io/en/v1.2.11/web3-eth-contract.html#id37
там получается внутри вызывается метод send() и далее слушает ивенты типа
send().on('transactionHash', function(hash){
...
})
.on('confirmation', function(confirmationNumber, receipt){
...
})
вот мне надо было что-то подобное сделать из моей кастомной функции, чтобы можно было в существующую логику свою кастомную функцию передать и чтобы всё корректно работало
Viktor
что-то я не понял, это ж обычный event emitter, то есть интерфейс, который как реализован web3 должно быть пофигу.
Viktor
мне кажется тебе нужно сделать шаг назад, дать больше контекста какую задачу решаешь.
Viktor
пока звучит как ты берёшь mitt, вызываешь mitt() и передаёшь «будто бы это send» → и должно работать.