Типы данных, от базового до расширенного

Каждый день я знакомился с разными типами структур данных и алгоритмами. Я научился обращаться с

Некоторые проблемы включали более сложные структуры, такие как связанные списки и двоичные деревья, в то время как другие добавляли в смесь матрицы/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 дней, несомненно, будут использованы в моей карьере инженера-программиста.

Я горжусь тем, что приложил усилия, и благодарен своим друзьям, которые подбадривали меня и предлагали свою поддержку и мудрость на протяжении всего испытания.

\\\"#aysofCode

","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"}}
«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > #aysofCode, сентябрь: Мой путь к мастерству DSA

#aysofCode, сентябрь: Мой путь к мастерству DSA

Опубликовано 7 ноября 2024 г.
Просматривать:829

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

Я не просто придерживался одной платформы — я выполнил задание «30 дней программирования» от HackerRank, план «30 дней использования JavaScript» от LeetCode, а также прошел трек «Top Interview 150» от LeetCode, сборник из 150 типичных задач на собеседовании для всех, кто готовится к собеседование по кодированию. Кроме того, я взял несколько уроков по Structy, чтобы еще больше углубить понимание концепций DSA.

Большинство проблем я решил с помощью JavaScript (за исключением нескольких проблем HackerRank, где JavaScript не поддерживался, поэтому вместо этого я использовал Python). Чтобы помочь мне нести ответственность, а также делиться своим прогрессом, я публиковал в Твиттере задачи, которые решал каждый день. Вы можете найти их в этом списке цитат:

Типы данных, от базового до расширенного

Каждый день я знакомился с разными типами структур данных и алгоритмами. Я научился обращаться с

  • массивы
  • строки
  • объекты
  • карты
  • наборы
  • цифры
  • логические значения и многое другое.

Некоторые проблемы включали более сложные структуры, такие как связанные списки и двоичные деревья, в то время как другие добавляли в смесь матрицы/n-D массивы, что позволяло мне иметь дело с многомерными пространствами.

Разнообразие проблем держало меня в напряжении. Проблемы на треке LeetCode «30 дней JavaScript» познакомили меня с такими основами, как

  • преобразования массива
  • преобразования функций
  • закрытие
  • классы
  • JSON
  • Обещания и время.

Трек Top Interview 150 от LeetCode сделал еще один шаг вперед, бросая меня между задачами различной сложности и подхода. Решение хотя бы одной из них каждый день было неоценимо. Эти проблемы также заставили меня чаще думать об оптимизации и о том, как различные подходы могут существенно повлиять на время выполнения и эффективность использования памяти.

Параллельно с этими задачами я также брал уроки Structy, чтобы укрепить свое понимание ключевых концепций. Я научился более эффективным способам обработки некоторых структур данных, таких как разделы связанных списков и двоичных деревьев. Я особенно оценил динамичный подход платформы к обучению и разбиению проблем таким образом, чтобы их было легко усвоить. Это отличная платформа для изучения DSA на самом базовом уровне, а затем применения этих знаний к другим проблемам кодирования, с которыми я сталкиваюсь.

Подходы и методы

По прошествии нескольких дней я столкнулся со многими видами подходов к решению проблем, такими как

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

Я нашел подход с двумя указателями простым, но мощным способом решения проблем, связанных с последовательностями (в основном массивами и строками), за счет сокращения пространства поиска для более эффективных решений. Я также использовал жадные алгоритмы, где мне нужно было делать локально оптимальный выбор на каждом этапе.

Техника скользящих окон стала еще одним откровением — изначально сложная, но полезная для задач, связанных с подмассивами или подстроками; проблемы, требующие отслеживания движущегося диапазона элементов внутри последовательности. Хэш-карты и хеш-таблицы отлично подходят для пар ключ-значение в задачах, связанных с частым поиском.

Одним из самых сложных методов, с которыми я работал, было динамическое программирование. Поначалу я находил DP довольно пугающим из-за сложности распознавания перекрывающихся подзадач, но при повторном воздействии мемоизация стала моим лучшим другом в оптимизации рекурсивных вызовов.

Манипуляция функциями (с участием оболочек и прототипов)

Помимо основных проблем с DSA, у меня также появилась возможность опробовать более продвинутые концепции JavaScript. Я написал функции-оболочки, научился контролировать поток своего кода и расширять функциональность в соответствии с конкретными требованиями. Я даже научился устанавливать таймеры на функции, что позволяет мне выполнять операции, чувствительные ко времени, или ограничивать частоту выполнения определенных функций.

Работа с прототипами показала мне, что типами данных можно манипулировать, выходя за рамки их встроенных возможностей, путем создания собственных методов. Это позволило мне по-новому расширить встроенную функциональность типов данных, таких как объекты и массивы. Я осознал важность написания чистого модульного кода.

Я также изучил мемоизацию — метод, при котором вы изменяете функцию так, что она сохраняет ранее вызванные аргументы вместе с их результатами! Это своего рода кэширование, которое помогает повысить производительность в задачах, связанных с несколькими вызовами одной и той же функции. Я писал о своем решении Memoize, которое превосходит 99% (память) здесь: Интуитивное решение Memoize превосходит 99% памяти.

Тестирование и оптимизация

Еще одна вещь, которой я начал уделять больше внимания во время этого путешествия, — это оптимизация моего кода. После надлежащего введения в нотацию big-O в Structy я понял важность временной и пространственной сложности и изучил оптимальную технику для решения наиболее распространенных проблем. Ближе к концу программы HackerRank я также научился тестировать код с использованием классов и писать дженерики.

Еда на вынос

К тому времени, когда я завершил задание «30 дней кода», я почувствовал глубокое чувство роста. Это улучшило мою способность решать широкий спектр задач и углубило понимание JavaScript и DSA. Это месячное путешествие стало не просто решением проблем, оно стало для меня напоминанием о том, что я действительно могу приложить усилия. Видя преимущества последовательности и дисциплины, я обновился и научился подходить к любой задаче с уверенностью и сильным набором техник.

Этот опыт стал важной вехой в моем пути программирования. Навыки, которые я отточил за эти 30 дней, несомненно, будут использованы в моей карьере инженера-программиста.

Я горжусь тем, что приложил усилия, и благодарен своим друзьям, которые подбадривали меня и предлагали свою поддержку и мудрость на протяжении всего испытания.

#aysofCode September: My journey to DSA Mastery

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/akcumeh/30daysofcode-september-my-journey-to-dsa-mastery-647?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3