Cada dia me expunha a diferentes tipos de estruturas de dados e algoritmos. Aprendi a lidar
Alguns problemas envolviam estruturas mais complexas, como listas vinculadas e árvores binárias, enquanto outros incluíam matrizes / arrays n-D na mistura, permitindo-me lidar com espaços multidimensionais.
A diversidade dos problemas me manteve alerta. Os problemas na trilha de 30 dias de JavaScript do LeetCode me apresentaram fundamentos como
A faixa Top Interview 150 do LeetCode levou as coisas um passo adiante, jogando-me entre problemas de dificuldade e abordagem variadas. Resolver pelo menos um deles por dia foi inestimável. Esses problemas também me desafiaram a pensar com mais frequência sobre otimização e como diferentes abordagens poderiam afetar drasticamente o tempo de execução e a eficiência da memória.
Também tive aulas de Structy junto com esses desafios para solidificar minha compreensão dos principais conceitos. Aprendi maneiras mais eficientes de lidar com algumas estruturas de dados, como seções em listas vinculadas e árvores binárias. Passei a apreciar especialmente a abordagem dinâmica da plataforma para ensinar e analisar problemas de uma forma que os torne fáceis de digerir. É uma ótima plataforma para aprender DSA em um nível muito básico e depois traduzir esse entendimento para outros problemas de codificação que enfrento.
Com o passar dos dias, encontrei muitos tipos de abordagens de solução, técnicas de resolução de problemas, como
Achei a abordagem de dois ponteiros uma maneira direta, porém poderosa, de trabalhar com problemas envolvendo sequências (principalmente arrays e strings), reduzindo o espaço de busca para soluções mais eficientes. Também usei algoritmos gananciosos onde precisava fazer escolhas localmente ideais em cada etapa.
As técnicas de janela deslizante foram outra revelação - inicialmente desafiadoras, mas valiosas para problemas envolvendo submatrizes ou substrings; problemas que exigiam acompanhar uma gama móvel de elementos dentro de uma sequência. Hashmaps e hashtables são ótimos para pares de valores-chave em problemas que envolvem pesquisas frequentes.
Uma das técnicas mais complexas com as quais trabalhei foi a programação dinâmica. No início, achei o DP bastante intimidante devido à dificuldade em reconhecer subproblemas sobrepostos, mas com a exposição repetida, a memoização tornou-se meu melhor amigo na otimização de chamadas recursivas.
Além dos principais problemas de DSA, também tive a oportunidade de experimentar conceitos mais avançados de JavaScript. Escrevi funções wrapper, aprendendo como controlar o fluxo do meu código e estender a funcionalidade para requisitos específicos. Aprendi até a definir temporizadores em funções, o que me permite lidar com operações urgentes ou limitar a frequência com que certas funções podem ser executadas.
Trabalhar com protótipos me mostrou que os tipos de dados podem ser manipulados além de seus recursos integrados, criando métodos personalizados. Isso me permitiu estender a funcionalidade integrada de tipos de dados, como objetos e matrizes, de novas maneiras. Passei a apreciar a importância de escrever código limpo e modular.
Também aprendi memoização, uma técnica em que você modifica uma função de forma que ela armazene argumentos chamados anteriormente com seus resultados! Este é um tipo de cache que ajuda a melhorar o desempenho em problemas onde existem múltiplas chamadas para a mesma função. Escrevi sobre minha solução Memoize que superou 99% (memória) aqui: Memoize Intutitive Solution superou 99% de memória.
Outra coisa que comecei a prestar mais atenção durante essa jornada foi a otimização do meu código. Após uma introdução adequada à notação big-O no Structy, entendi a importância da complexidade de tempo e espaço e aprendi a técnica ideal para a maioria dos problemas comuns. Perto do final do desafio HackerRank, também aprendi a testar código usando classes e a escrever genéricos.
Quando concluí o desafio 30 dias de código, tive uma profunda sensação de crescimento. Melhorou minha capacidade de lidar com uma ampla gama de problemas e aprofundou minha compreensão de JavaScript e DSA. Mais do que apenas resolver problemas, esta jornada de um mês foi um lembrete para mim mesmo de que eu realmente poderia me esforçar. Vendo as recompensas da consistência e disciplina, fui renovado com a mentalidade para abordar qualquer desafio com confiança e um forte kit de ferramentas de técnicas.
Esta experiência é um marco significativo em minha jornada de programação. As habilidades que aprimorei nesses 30 dias sem dúvida serão levadas adiante em minha carreira como engenheiro de software.
Estou orgulhoso de ter me esforçado e grato aos meus amigos que me apoiaram e ofereceram seu apoio e sabedoria durante todo o desafio.
","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"}}Em setembro, embarquei em um desafio autoimposto 30 dias de código, um compromisso de resolver pelo menos dois problemas de estruturas de dados e algoritmos (DSA) todos os dias. Meu objetivo era sair da minha zona de conforto, construir consistência e melhorar minhas habilidades de resolução de problemas e lógica de programação.
Eu não me limitei a uma plataforma - concluí o desafio 30 dias de código do HackerRank, o plano 30 dias de JavaScript do LeetCode e também abordei a faixa Top Interview 150 do LeetCode, uma coleção de 150 problemas típicos de entrevista para qualquer pessoa que esteja se preparando para um entrevista de codificação. Além disso, tive algumas aulas sobre Structy para fortalecer ainda mais minha compreensão dos conceitos de DSA.
Resolvi a maioria dos problemas usando JavaScript (exceto alguns problemas do HackerRank em que JavaScript não era compatível, então usei Python). Para ajudar a me manter responsável e também para compartilhar meu progresso, publiquei os desafios que resolvia todos os dias no Twitter. Você pode encontrá-los nesta trilha de citações:
Cada dia me expunha a diferentes tipos de estruturas de dados e algoritmos. Aprendi a lidar
Alguns problemas envolviam estruturas mais complexas, como listas vinculadas e árvores binárias, enquanto outros incluíam matrizes / arrays n-D na mistura, permitindo-me lidar com espaços multidimensionais.
A diversidade dos problemas me manteve alerta. Os problemas na trilha de 30 dias de JavaScript do LeetCode me apresentaram fundamentos como
A faixa Top Interview 150 do LeetCode levou as coisas um passo adiante, jogando-me entre problemas de dificuldade e abordagem variadas. Resolver pelo menos um deles por dia foi inestimável. Esses problemas também me desafiaram a pensar com mais frequência sobre otimização e como diferentes abordagens poderiam afetar drasticamente o tempo de execução e a eficiência da memória.
Também tive aulas de Structy junto com esses desafios para solidificar minha compreensão dos principais conceitos. Aprendi maneiras mais eficientes de lidar com algumas estruturas de dados, como seções em listas vinculadas e árvores binárias. Passei a apreciar especialmente a abordagem dinâmica da plataforma para ensinar e analisar problemas de uma forma que os torne fáceis de digerir. É uma ótima plataforma para aprender DSA em um nível muito básico e depois traduzir esse entendimento para outros problemas de codificação que enfrento.
Com o passar dos dias, encontrei muitos tipos de abordagens de solução, técnicas de resolução de problemas, como
Achei a abordagem de dois ponteiros uma maneira direta, porém poderosa, de trabalhar com problemas envolvendo sequências (principalmente arrays e strings), reduzindo o espaço de busca para soluções mais eficientes. Também usei algoritmos gananciosos onde precisava fazer escolhas localmente ideais em cada etapa.
As técnicas de janela deslizante foram outra revelação - inicialmente desafiadoras, mas valiosas para problemas envolvendo submatrizes ou substrings; problemas que exigiam acompanhar uma gama móvel de elementos dentro de uma sequência. Hashmaps e hashtables são ótimos para pares de valores-chave em problemas que envolvem pesquisas frequentes.
Uma das técnicas mais complexas com as quais trabalhei foi a programação dinâmica. No início, achei o DP bastante intimidante devido à dificuldade em reconhecer subproblemas sobrepostos, mas com a exposição repetida, a memoização tornou-se meu melhor amigo na otimização de chamadas recursivas.
Além dos principais problemas de DSA, também tive a oportunidade de experimentar conceitos mais avançados de JavaScript. Escrevi funções wrapper, aprendendo como controlar o fluxo do meu código e estender a funcionalidade para requisitos específicos. Aprendi até a definir temporizadores em funções, o que me permite lidar com operações urgentes ou limitar a frequência com que certas funções podem ser executadas.
Trabalhar com protótipos me mostrou que os tipos de dados podem ser manipulados além de seus recursos integrados, criando métodos personalizados. Isso me permitiu estender a funcionalidade integrada de tipos de dados, como objetos e matrizes, de novas maneiras. Passei a apreciar a importância de escrever código limpo e modular.
Também aprendi memoização, uma técnica em que você modifica uma função de forma que ela armazene argumentos chamados anteriormente com seus resultados! Este é um tipo de cache que ajuda a melhorar o desempenho em problemas onde existem múltiplas chamadas para a mesma função. Escrevi sobre minha solução Memoize que superou 99% (memória) aqui: Memoize Intutitive Solution superou 99% de memória.
Outra coisa que comecei a prestar mais atenção durante essa jornada foi a otimização do meu código. Após uma introdução adequada à notação big-O no Structy, entendi a importância da complexidade de tempo e espaço e aprendi a técnica ideal para a maioria dos problemas comuns. Perto do final do desafio HackerRank, também aprendi a testar código usando classes e a escrever genéricos.
Quando concluí o desafio 30 dias de código, tive uma profunda sensação de crescimento. Melhorou minha capacidade de lidar com uma ampla gama de problemas e aprofundou minha compreensão de JavaScript e DSA. Mais do que apenas resolver problemas, esta jornada de um mês foi um lembrete para mim mesmo de que eu realmente poderia me esforçar. Vendo as recompensas da consistência e disciplina, fui renovado com a mentalidade para abordar qualquer desafio com confiança e um forte kit de ferramentas de técnicas.
Esta experiência é um marco significativo em minha jornada de programação. As habilidades que aprimorei nesses 30 dias sem dúvida serão levadas adiante em minha carreira como engenheiro de software.
Estou orgulhoso de ter me esforçado e grato aos meus amigos que me apoiaram e ofereceram seu apoio e sabedoria durante todo o desafio.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3