Порридж В Ко-ливинге
Красота.
Вообще понятно? Надо по хорошему ребят спрашивать из чата, у которых нет 300+ нарешенных 😆, но они почему-то редко отписываются
Slava
почему в этом примере начинается с 8, а не с 1?
Viktor
почему в этом примере начинается с 8, а не с 1?
видимо, потому что 1 находятся в разных списках. здесь хотят найти не одинаковое значение, а именно точку в которой списки «сливаются в один».
Slava
понял, спасибо)
Viktor
я конечно понимаю, что просят O(1) по памяти, но очень лениво это писать когда просто можно сложить все в сет 😃
Порридж В Ко-ливинге
Правда код немножко улучшил, но это мелочи
Dida
Интересно, в чем сакральная суть Бесконечного отеля? То есть в чем суть вот этих всех перемещений постояльцев на номер+1? Не легче ли сделать вставку в конец списка (последний постоялец)+1?
Viktor
там по-моему суть не в этих перемещениях, они просто нужны чтобы проиллюстрировать, что когда речь идёт о бесконечностях, то обычные сравнения к которым мы привыкли а-ля «количество комнат с нечетными номерами всегда меньше общего количества комнат» теряют смысл.
Viktor
к чему этот вопрос вообще? ты какую книгу читаешь? 😃
Dida
Я сейчас читаю "Практика реактивного программирования в Spring 5". И почему-то в голове начал крутиться этот парадокс бесконечного отеля.
Dida
ахаха. неожиданно 😃
Да, такое у меня бывает)) позднее зажигание😂😂
Viktor
пример с заселением гостя мне как раз тоже кажется странным, в том смысле, что ничего удивительного в этом нет — ну бесконечное количество комнат, понятное, что ты всегда найдёшь себе ещё одну. А вот когда тебе надо поселить бесконечное количество посетителей и для этого надо освободить бесконечное количество комнат, и в одной бесконечности у тебя находится место для другой бесконечности... вот это уже нормально так мозг ломает.
Viktor
то есть ты их как бы сравнить не можешь, и это непривычно для нашего мозга, мы все же живём в мире счетных и конечных множеств.
Viktor
и привыкает к этому с детства.
Viktor
... а потом ты поступаешь на мехмат и твой мир медленно рушится у тебя на глазах 😂
Dida
Да, в этом ракурсе, конечно, невероятный парадокс. Спасибо за разъяснения)))
Viktor
Если есть желание прыгнуть в кроличью нору, рекомендую классику https://en.wikipedia.org/wiki/What_Is_Mathematics%3F
Dida
😁👍
Roman
В сегодняшней задаче неоптимальное решение лежит недалеко от оптимального) В неоптимальном можно бежать по одним и тем же листам K раз, пока не пересекуться, то есть cur1 = cur1 ? cur1.next : head1 cur2 = cur2 ? cur2.next : head2 А в оптимальном головы надо менять местами, когда дошли до конца)
Порридж В Ко-ливинге
Вот это я называю упоролся: https://github.com/mame/quine-relay
Порридж В Ко-ливинге
Кто не понял, этот код производит аутпутом код другого языка, который производит код еще другого языка и т.д., а в конце он возвращается в первый код
Alex Azarov
Свифта нет(
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Как?
Ну это вроде не совсем один проход, но один while loop https://leetcode.com/problems/intersection-of-two-linked-lists/discuss/1092935/Python-Short-but-difficult-solution-explained
Порридж В Ко-ливинге
Решил идти от обратного, делать не ИЗИ, а ХАРД решения для ПРО: https://leetcode.com/problems/average-of-levels-in-binary-tree/discuss/1094418/Python-short-tricky-solution-for-pros-explained
Viktor
Решил идти от обратного, делать не ИЗИ, а ХАРД решения для ПРО: https://leetcode.com/problems/average-of-levels-in-binary-tree/discuss/1094418/Python-short-tricky-solution-for-pros-explained
да, нормальная тема через BFS, хотя DFS выглядит проще здесь, имхо. но для тренировки стоит и то и то написать.
Порридж В Ко-ливинге
Viktor
Почему DFS проще? Наоборот же надо уровни посчитать...
ну как-то для понимания что ли проще: завёл мапу для уровней, прошёлся рекурсивно по дереву и разложил в мапу по уровням.
Порридж В Ко-ливинге
Viktor
то, как работает BFS, ещё знать надо.
Viktor
но вообще поэтому для тренировки и полезно его написать.
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Ладно, щас пример распишу
Viktor
Да вроде я каждый уровень “складываю”, и иду дальше, все понятно вроде
не, всё понятно, я ж не про это. я просто говорю, что это чисто субъективное ощущение, что разложить по уровням рекурсивно проще, чем знать что BFS и так разложит тебе по уровням, потому что он так работает.
Viktor
хотя на собесе мне было б интересно знает ли кандидат «как работает BFS».
Viktor
Наверное, я BFS решал на собесе в Яндекс 1.5 года назад, когда для меня деревья это в парке только были))00
ну вот всё индивидуально. мне кажется, что рекурсивный обход дерева обычно люди раньше понимают чем BFS.
Viktor
просто потому что с BFS сталкиваться где-то кроме литкода не приходится 😂
Viktor
Хотя решение через BFS мне нравится. Написал оба 🙂
Viktor
https://gist.github.com/vitkarpov/54c7f35cfce3b822cf57ad8500871d92
Alex Azarov
Добби свободен, коллеги реально носок подарили
Viktor
поздравляю 🙂
Viktor
в добрый путь, как говорится.
Viktor
https://www.instagram.com/p/BprbSnKFRW4/?igshid=1z2hthszzh0j
Viktor
помню этот день у себя. такой день бывает только раз 😊
Viktor
птенец выпархнул из уютного гнезда 😃
Viktor
Задача классная, надо разбор делать.
Viktor
var findAllConcatenatedWordsInADict = function(words) { const trie = new Trie(); function dfs(word, start, chainLen) { if (word.length == start) { // нужно убедиться, что нашли больше чем одно слово в цепочке return chainLen > 1; } let curr = trie.root; for (let i = start; i < word.length; i++) { curr = curr.get(word[i]); // если в дереве нет следующем буквы, // значит нет ни одного слова для продолжения if (!curr) { return false; } // если это лист, надо попборовать снова поискать все дерево // в поиске следующих слов, только отрезав уже найденный «префикс» if (curr.isLeaf && dfs(word, i + 1, chainLen + 1)) { return true; } } return false; } const result = []; // оптимизация, которая позволит // исключить TLE для кейса с общими префиксами: // a, aa, aaa, aaaa, aaaaa, ... // имеет смысл добавлять слова в трай постепенно, // т.к. в любом случае маленькие слова нельзя побить большими, // соответственно и в дереве они раньше времени не нужны words.sort((a, b) => a.length - b.length); words.forEach((word) => { if (dfs(word, 0, 0)) { result.push(word); } else { trie.add(word); } }); return result; }; class Trie { root = new Node("") add(word) { let curr = this.root; for (let i = 0; i < word.length; i++) { curr = curr.add(word[i]); } curr.isLeaf = true; } } class Node { isLeaf = false; children = new Array(26); constructor(val) { this.val = val; } add(val) { const idx = this.idx(val); if (!this.children[idx]) { this.children[idx] = new Node(val); } return this.children[idx]; } get(val) { return this.children[this.idx(val)]; } idx(val) { return val.charCodeAt(0) - 'a'.charCodeAt(0); } }
Viktor
В принципе. если исключить сам трай отсюда, то даже компактная получилась.
Evgeniy
По времени нормально?
Viktor
вроде норм
Evgeniy
👍
Viktor
по крайней мере, проходит.
Viktor
я там отметил оптимизацию без которой не проходит.
Viktor
то есть все слова заранее в трай пихать нельзя.
Evgeniy
А, нашел комментарий
Viktor
Почему? 🤔
а там есть кейс с a, aa, aaa, aaaa... и тогда этот dfs начинает зря искать просто как не в себя.
Viktor
ага.
Viktor
я сперва делал просто, потом этот кейс свалился.
Viktor
пришлось чутка оптимизировать.
Порридж В Ко-ливинге
https://www.instagram.com/p/BprbSnKFRW4/?igshid=1z2hthszzh0j
Ага, у меня такой фоточки уже не будет... Электронная трудовая
Порридж В Ко-ливинге
помню этот день у себя. такой день бывает только раз 😊
Пхахаа, у меня коллега уже 2ой раз из Я уходит))0)
Viktor
Пхахаа, у меня коллега уже 2ой раз из Я уходит))0)
вернулся только за ачивкой терминатора? 😃