Каждый день я знакомился с разными типами структур данных и алгоритмами. Я научился обращаться с
Некоторые проблемы включали более сложные структуры, такие как связанные списки и двоичные деревья, в то время как другие добавляли в смесь матрицы/n-D массивы, что позволяло мне иметь дело с многомерными пространствами.
Разнообразие проблем держало меня в напряжении. Проблемы на треке LeetCode «30 дней JavaScript» познакомили меня с такими основами, как
Трек Top Interview 150 от LeetCode сделал еще один шаг вперед, бросая меня между задачами различной сложности и подхода. Решение хотя бы одной из них каждый день было неоценимо. Эти проблемы также заставили меня чаще думать об оптимизации и о том, как различные подходы могут существенно повлиять на время выполнения и эффективность использования памяти.
Параллельно с этими задачами я также брал уроки Structy, чтобы укрепить свое понимание ключевых концепций. Я научился более эффективным способам обработки некоторых структур данных, таких как разделы связанных списков и двоичных деревьев. Я особенно оценил динамичный подход платформы к обучению и разбиению проблем таким образом, чтобы их было легко усвоить. Это отличная платформа для изучения DSA на самом базовом уровне, а затем применения этих знаний к другим проблемам кодирования, с которыми я сталкиваюсь.
По прошествии нескольких дней я столкнулся со многими видами подходов к решению проблем, такими как
Я нашел подход с двумя указателями простым, но мощным способом решения проблем, связанных с последовательностями (в основном массивами и строками), за счет сокращения пространства поиска для более эффективных решений. Я также использовал жадные алгоритмы, где мне нужно было делать локально оптимальный выбор на каждом этапе.
Техника скользящих окон стала еще одним откровением — изначально сложная, но полезная для задач, связанных с подмассивами или подстроками; проблемы, требующие отслеживания движущегося диапазона элементов внутри последовательности. Хэш-карты и хеш-таблицы отлично подходят для пар ключ-значение в задачах, связанных с частым поиском.
Одним из самых сложных методов, с которыми я работал, было динамическое программирование. Поначалу я находил DP довольно пугающим из-за сложности распознавания перекрывающихся подзадач, но при повторном воздействии мемоизация стала моим лучшим другом в оптимизации рекурсивных вызовов.
Помимо основных проблем с DSA, у меня также появилась возможность опробовать более продвинутые концепции JavaScript. Я написал функции-оболочки, научился контролировать поток своего кода и расширять функциональность в соответствии с конкретными требованиями. Я даже научился устанавливать таймеры на функции, что позволяет мне выполнять операции, чувствительные ко времени, или ограничивать частоту выполнения определенных функций.
Работа с прототипами показала мне, что типами данных можно манипулировать, выходя за рамки их встроенных возможностей, путем создания собственных методов. Это позволило мне по-новому расширить встроенную функциональность типов данных, таких как объекты и массивы. Я осознал важность написания чистого модульного кода.
Я также изучил мемоизацию — метод, при котором вы изменяете функцию так, что она сохраняет ранее вызванные аргументы вместе с их результатами! Это своего рода кэширование, которое помогает повысить производительность в задачах, связанных с несколькими вызовами одной и той же функции. Я писал о своем решении Memoize, которое превосходит 99% (память) здесь: Интуитивное решение Memoize превосходит 99% памяти.
Еще одна вещь, которой я начал уделять больше внимания во время этого путешествия, — это оптимизация моего кода. После надлежащего введения в нотацию big-O в Structy я понял важность временной и пространственной сложности и изучил оптимальную технику для решения наиболее распространенных проблем. Ближе к концу программы HackerRank я также научился тестировать код с использованием классов и писать дженерики.
К тому времени, когда я завершил задание «30 дней кода», я почувствовал глубокое чувство роста. Это улучшило мою способность решать широкий спектр задач и углубило понимание JavaScript и DSA. Это месячное путешествие стало не просто решением проблем, оно стало для меня напоминанием о том, что я действительно могу приложить усилия. Видя преимущества последовательности и дисциплины, я обновился и научился подходить к любой задаче с уверенностью и сильным набором техник.
Этот опыт стал важной вехой в моем пути программирования. Навыки, которые я отточил за эти 30 дней, несомненно, будут использованы в моей карьере инженера-программиста.
Я горжусь тем, что приложил усилия, и благодарен своим друзьям, которые подбадривали меня и предлагали свою поддержку и мудрость на протяжении всего испытания.
","image":"http://www.luping.net/uploads/20241006/172818757367020cb51a890.jpg","datePublished":"2024-11-07T22:11:52+08:00","dateModified":"2024-11-07T22:11:52+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}В сентябре этого года я приступил к добровольному 30 дней кода — обязательству решать как минимум две проблемы со структурами данных и алгоритмами (DSA) каждый божий день. Моей целью было выйти из зоны комфорта, добиться последовательности и улучшить навыки решения проблем и логику программирования.
Я не просто придерживался одной платформы — я выполнил задание «30 дней программирования» от HackerRank, план «30 дней использования JavaScript» от LeetCode, а также прошел трек «Top Interview 150» от LeetCode, сборник из 150 типичных задач на собеседовании для всех, кто готовится к собеседование по кодированию. Кроме того, я взял несколько уроков по Structy, чтобы еще больше углубить понимание концепций DSA.
Большинство проблем я решил с помощью JavaScript (за исключением нескольких проблем HackerRank, где JavaScript не поддерживался, поэтому вместо этого я использовал Python). Чтобы помочь мне нести ответственность, а также делиться своим прогрессом, я публиковал в Твиттере задачи, которые решал каждый день. Вы можете найти их в этом списке цитат:
Каждый день я знакомился с разными типами структур данных и алгоритмами. Я научился обращаться с
Некоторые проблемы включали более сложные структуры, такие как связанные списки и двоичные деревья, в то время как другие добавляли в смесь матрицы/n-D массивы, что позволяло мне иметь дело с многомерными пространствами.
Разнообразие проблем держало меня в напряжении. Проблемы на треке LeetCode «30 дней JavaScript» познакомили меня с такими основами, как
Трек Top Interview 150 от LeetCode сделал еще один шаг вперед, бросая меня между задачами различной сложности и подхода. Решение хотя бы одной из них каждый день было неоценимо. Эти проблемы также заставили меня чаще думать об оптимизации и о том, как различные подходы могут существенно повлиять на время выполнения и эффективность использования памяти.
Параллельно с этими задачами я также брал уроки Structy, чтобы укрепить свое понимание ключевых концепций. Я научился более эффективным способам обработки некоторых структур данных, таких как разделы связанных списков и двоичных деревьев. Я особенно оценил динамичный подход платформы к обучению и разбиению проблем таким образом, чтобы их было легко усвоить. Это отличная платформа для изучения DSA на самом базовом уровне, а затем применения этих знаний к другим проблемам кодирования, с которыми я сталкиваюсь.
По прошествии нескольких дней я столкнулся со многими видами подходов к решению проблем, такими как
Я нашел подход с двумя указателями простым, но мощным способом решения проблем, связанных с последовательностями (в основном массивами и строками), за счет сокращения пространства поиска для более эффективных решений. Я также использовал жадные алгоритмы, где мне нужно было делать локально оптимальный выбор на каждом этапе.
Техника скользящих окон стала еще одним откровением — изначально сложная, но полезная для задач, связанных с подмассивами или подстроками; проблемы, требующие отслеживания движущегося диапазона элементов внутри последовательности. Хэш-карты и хеш-таблицы отлично подходят для пар ключ-значение в задачах, связанных с частым поиском.
Одним из самых сложных методов, с которыми я работал, было динамическое программирование. Поначалу я находил DP довольно пугающим из-за сложности распознавания перекрывающихся подзадач, но при повторном воздействии мемоизация стала моим лучшим другом в оптимизации рекурсивных вызовов.
Помимо основных проблем с DSA, у меня также появилась возможность опробовать более продвинутые концепции JavaScript. Я написал функции-оболочки, научился контролировать поток своего кода и расширять функциональность в соответствии с конкретными требованиями. Я даже научился устанавливать таймеры на функции, что позволяет мне выполнять операции, чувствительные ко времени, или ограничивать частоту выполнения определенных функций.
Работа с прототипами показала мне, что типами данных можно манипулировать, выходя за рамки их встроенных возможностей, путем создания собственных методов. Это позволило мне по-новому расширить встроенную функциональность типов данных, таких как объекты и массивы. Я осознал важность написания чистого модульного кода.
Я также изучил мемоизацию — метод, при котором вы изменяете функцию так, что она сохраняет ранее вызванные аргументы вместе с их результатами! Это своего рода кэширование, которое помогает повысить производительность в задачах, связанных с несколькими вызовами одной и той же функции. Я писал о своем решении Memoize, которое превосходит 99% (память) здесь: Интуитивное решение Memoize превосходит 99% памяти.
Еще одна вещь, которой я начал уделять больше внимания во время этого путешествия, — это оптимизация моего кода. После надлежащего введения в нотацию big-O в Structy я понял важность временной и пространственной сложности и изучил оптимальную технику для решения наиболее распространенных проблем. Ближе к концу программы HackerRank я также научился тестировать код с использованием классов и писать дженерики.
К тому времени, когда я завершил задание «30 дней кода», я почувствовал глубокое чувство роста. Это улучшило мою способность решать широкий спектр задач и углубило понимание JavaScript и DSA. Это месячное путешествие стало не просто решением проблем, оно стало для меня напоминанием о том, что я действительно могу приложить усилия. Видя преимущества последовательности и дисциплины, я обновился и научился подходить к любой задаче с уверенностью и сильным набором техник.
Этот опыт стал важной вехой в моем пути программирования. Навыки, которые я отточил за эти 30 дней, несомненно, будут использованы в моей карьере инженера-программиста.
Я горжусь тем, что приложил усилия, и благодарен своим друзьям, которые подбадривали меня и предлагали свою поддержку и мудрость на протяжении всего испытания.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3