Ilia
Александр
О, это как у меня на работе в гитлабе 🙂
Ilia
Приватные репо не считаются же, поэтому у меня все хорошо ))
Порридж В Ко-ливинге
Мне с моим скромным прогрессом даже както стыдно немного :(
Смотря сколько времени тратишь и когда начал. Выглядит не плохо на самом деле - главное начать)
Александр
С работой и детьми на самом деле не так просто это дело совмещается. Хочется часа 2-3 алгоритмить, получается час + еще разборы смотрю
Порридж В Ко-ливинге
Я всем рекомендую https://leetcode.com/explore/interview/card/top-interview-questions-easy/ Прорешаете все 50 легких - спокойно пройдете на джуновские позиции в ФААНГ (в Яндекс точно). А если мидлы и харды прорегаете, то можно уже спокойно в ФААНГ влетатт
Порридж В Ко-ливинге
Я вот уже 60% хардов решил, сложно, уже 3 раза ответ смотрел(
Plotnik
Приватные репо не считаются же, поэтому у меня все хорошо ))
Там вроде есть галочка чтобы считало приватные
Null
Happy Monday! 👋 На этой неделе разбираем классический пример задачи на графы и обход в ширину, где как раз нужны очереди. https://vitkarpov.me/posts/word-ladder/
Порридж В Ко-ливинге
Happy Monday! 👋 На этой неделе разбираем классический пример задачи на графы и обход в ширину, где как раз нужны очереди. https://vitkarpov.me/posts/word-ladder/
О, прям честный граф строится. А я как всегда эту задачку через сеты решал. Вообще сеты вещь опупенная)
Andrey
Happy Monday! 👋 На этой неделе разбираем классический пример задачи на графы и обход в ширину, где как раз нужны очереди. https://vitkarpov.me/posts/word-ladder/
Привет! Есть некоторая мысль по поводу этой задачи, но я не совсем в ней уверен. В твоей реализации ты сначала строишь граф за O(N^2), а потом начинаешь его обходить за O(N). Если же предположить, что в wordList будут "лишние" слова (отличающиеся более, чем на 1 символ, а значит не интересные нам), то нам всё равно придётся их проверять. Предположение моё заключается в том, что мы можем искать соседей на лету, перед отправкой в очередь. В худшем случае, если все слова потенциально нам подходят, мы получим ровно тот же O(N^2). Если же в wordList много мусора, то это может нам выиграть время. Впрочем, есть ощущение, что на leetcode нет таких кейсов. Я тоже сначала строил граф, а потом попробовал "оптимизировать", время при этом не меняется.
Порридж В Ко-ливинге
Привет! Есть некоторая мысль по поводу этой задачи, но я не совсем в ней уверен. В твоей реализации ты сначала строишь граф за O(N^2), а потом начинаешь его обходить за O(N). Если же предположить, что в wordList будут "лишние" слова (отличающиеся более, чем на 1 символ, а значит не интересные нам), то нам всё равно придётся их проверять. Предположение моё заключается в том, что мы можем искать соседей на лету, перед отправкой в очередь. В худшем случае, если все слова потенциально нам подходят, мы получим ровно тот же O(N^2). Если же в wordList много мусора, то это может нам выиграть время. Впрочем, есть ощущение, что на leetcode нет таких кейсов. Я тоже сначала строил граф, а потом попробовал "оптимизировать", время при этом не меняется.
Вообще можно фолоуапом добавить решение O(W * R), где W - длина слова, а R - результат (< N). В итоге почти всегда будет быстрее O(N^2) решения + покажем чтотдля обшода в ширину можно использовать сеты)
Andrey
Ранний выход из isOneCharDiff у меня не сработал, кстати. Возможно, это косяк грейдилки литкода. У меня вышло 308ms без раннего выхода, и 304ms с ним.
Viktor
Привет! Есть некоторая мысль по поводу этой задачи, но я не совсем в ней уверен. В твоей реализации ты сначала строишь граф за O(N^2), а потом начинаешь его обходить за O(N). Если же предположить, что в wordList будут "лишние" слова (отличающиеся более, чем на 1 символ, а значит не интересные нам), то нам всё равно придётся их проверять. Предположение моё заключается в том, что мы можем искать соседей на лету, перед отправкой в очередь. В худшем случае, если все слова потенциально нам подходят, мы получим ровно тот же O(N^2). Если же в wordList много мусора, то это может нам выиграть время. Впрочем, есть ощущение, что на leetcode нет таких кейсов. Я тоже сначала строил граф, а потом попробовал "оптимизировать", время при этом не меняется.
А как искать соседей на лету? Скажем у нас одно слово в начале списка, а другое в конце, и оба отличаются на один символ.
Порридж В Ко-ливинге
Не очень уловил, можно чуть подробнее?
Загрузил все строки в Set, а потом в ищешь в ширину, но не идя по Set и проверяя, а меняя букву одну и смотря, есть ли онив Set
Viktor
Загрузил все строки в Set, а потом в ищешь в ширину, но не идя по Set и проверяя, а меняя букву одну и смотря, есть ли онив Set
Идея норм, т.е. идёшь по всем словам, в каждом из них пробуешь 26 вариантов различных букв в каждой позиции и смотришь в сет, если нашлось слово — это возможный переход, а как сам путь искать?
Viktor
Зачем нам путь. Просто считаем каждый "переход" в глубину ширину
Там же кратчайший нужно путь найти. Обходя в ширину ты его гарантированно найдёшь, не перебирая все пути.
Viktor
Ой, обход в ширину. Нам не надо пути переьирать все
Ага, ясно. Не понял как в ширину ты обходишь пока.
Andrey
А как искать соседей на лету? Скажем у нас одно слово в начале списка, а другое в конце, и оба отличаются на один символ.
А точно так же, как и в buildGraph - его внутренним циклом. Вот, в чем вижу проблему: ["hot","dot","dog","lot","log","cog","aaa","bbb","zzz"] { hit: ['hot'], hot: ['dot','lot'], dot: ['dog','lot'], dog: ['log','cog'], lot: ['log'], log: ['cog'], aaa: [], bbb: [], zzz: [], } В buildGraph мы для aaa, bbb, zzz переберем все остальные слова, чтобы проверить нет ли у них соседей. В моём варианте мы их вообще трогать не будем. Начали с первого слова, прошлись циклом, получили hot. Дальше ищем соседей для hot и т.д. В итоге лишняя работа не будет произведена.
Порридж В Ко-ливинге
Viktor
О, прям честный граф строится. А я как всегда эту задачку через сеты решал. Вообще сеты вещь опупенная)
Честный граф, чтобы показать, что это граф, да. Я понял, ты строишь его «на лету», не складывая в отдельный словарь, а сразу в очередь.
Порридж В Ко-ливинге
Viktor
Оказалось я делал это на плюсах, т.к. строки мутабельный https://pastebin.com/wNH4VSzV
Да мог просто сплитнуть строку в массив и там менять сколько влезет.
Viktor
Да мог просто сплитнуть строку в массив и там менять сколько влезет.
Правда, чтобы проверить строку в сете всё равно нужно получить строку, то есть этот массив сериализовать. Меня пугается постоянное создание новых строк, хотя всё равно это может быть быстрее.
Andrey
Реализовал эту идею, получилось ещё медленнее 😂 Из-за постоянного создания строк. Ну, понятно дело, что там тесты так подобраны, что нет «лишних слов».
Забыл уточнить, что я исключительно индексами оперировал, а не строками :) https://github.com/SlivTime/leetcode/blob/master/src/127-word-ladder/word_ladder.go#L17
Viktor
Забыл уточнить, что я исключительно индексами оперировал, а не строками :) https://github.com/SlivTime/leetcode/blob/master/src/127-word-ladder/word_ladder.go#L17
просто если делать эту историю с сетами все равно ж придётся генерировать горы строк, чтобы их сравнивать с тем, что в списке
Viktor
> Мы смотрим на деток Статья написана отцом
привычка дурацкая называть дочерние узлы детками 😃
Viktor
ещё с Яндекса осталось «вьюшки» и «модельки»
Andrey
Кстати да, я тоже привык называть их детками сильно до того, как стал отцом, так что не считается :)
Andrey
О, сегодня в челлендже наконец-то простая задача. Решил сначала схалтурить, и написал решение через промежуточный массив, но там по памяти беда, что ожидаемо. В итоге пришлось немного подумать чтобы сделать in-place решение.
Ilia
На жс задачка весело решается в три строки ))
Ilia
Без дополнительный памяти?
все модификации только исходного массива
Andrey
Посмотрел как оно на питоне будет в 2 строчки. По времени отлично (лучше, чем 89%), а по памяти средне (<57%).
Ilia
все модификации только исходного массива
nums1.length = m; nums1.push(...nums2); nums1.sort((a,b) => a-b);
Andrey
nums1[m:] = nums2 nums1.sort() На питоне еще проще :)
Ilia
Ну тут особенности языка решают )
Andrey
Но всё равно, это как-то неспортивно
Ilia
Спортивно это быстрее всех решить ))
Andrey
Python
Andrey
Go
Viktor
Go
на го никто не решает 😃
Порридж В Ко-ливинге
Реализовал эту идею, получилось ещё медленнее 😂 Из-за постоянного создания строк. Ну, понятно дело, что там тесты так подобраны, что нет «лишних слов».
В плбсах такой вот проблемы нет. Монжо еще сравнение убрать, чтобы было настгящее O(R * W) а не O(R * (W^2)) под капотом. Но это головняк
Viktor
В плбсах такой вот проблемы нет. Монжо еще сравнение убрать, чтобы было настгящее O(R * W) а не O(R * (W^2)) под капотом. Но это головняк
Ну да, не надо постоянно новые строки создавать, но все равно надо считать хэш от строки, для проверки в сете, но это дешево. В js приходится создавать именно строку. Есть вариант сделать свою хеш-табличку, кстати, которая будет хэш считать по массиву символов, чтобы реально строки не клеить.
Viktor
Богатая идея. Учитывая, что там могут быть только 26 символов в алфавите, хеш можно считать просто.
Andrey
на го никто не решает 😃
Мне приятнее думать, что я самый быстрый стрелок на диком западе :)
Plotnik
Всем привет 👋 Подскажите пожалуйста кто знает как можно локально мерить рантайм перформанс чтобы он +/- совпадал с тем что показывает leetcode ?
Plotnik
Я понял, значит каждый раз руками
Plotnik
что значит руками?
С редактора копировать в редактор литкода и запускать
Ilia
написать плагин, который будет по апи лазить в литкод ))
Ilia
полез посмотреть, как он отправляет запрос, увидел забавный запрос: https://api.leetcode-cn.com/api/is_china_ip/?callback=afterCheckCnIp в ответ приходит false 😄
Viktor
написать плагин, который будет по апи лазить в литкод ))
главное в рейтлимитер не упереться, я иногда получал ошибку даже когда кнопку ручками нажимал, так что там суровый интервал стоит.
Ilia
я не смог найти как он запросы отправляет. как такое возможно? 😄
Ilia
может фильтр какой стоит в network?
да, ты прав, никогда им не пользуюсь, а тут он почему-то заполнен был
Ilia
у меня уже ступор был как так хитро отправляется запрос, что его не видно ))
Zahar
Interviews school, исчерпывающее руководство по собеседованиям для разработчиков: виды собеседований, составление резюме, основные секции (алгоритмы, проектирование систем, поведенческое интервью), офер и переговоры. Всё с примерами и практическими заданиями → https://interviews.school
Zahar
сюда вроде не кидали ещё, похоже, очень классный ресурс