Types de données, de base à avancé

Chaque jour m'a exposé à différents types de structures de données et d'algorithmes. J'ai appris à gérer

Certains problèmes impliquaient des structures plus complexes comme des listes chaînées et des arbres binaires, tandis que d'autres ajoutaient des matrices/des tableaux n-D dans le mélange, me permettant de gérer des espaces multidimensionnels.

La diversité des problèmes m'a tenu en haleine. Les problèmes sur la piste 30 jours de JavaScript de LeetCode m'ont fait découvrir des principes fondamentaux tels que

Le morceau Top Interview 150 de LeetCode est allé encore plus loin, me balançant entre des problèmes de difficulté et d'approche variables. Résoudre au moins un de ces problèmes chaque jour était inestimable. Ces problèmes m'ont également poussé à réfléchir plus souvent à l'optimisation et à la façon dont différentes approches pourraient affecter considérablement l'exécution et l'efficacité de la mémoire.

J'ai également suivi des cours de Structy parallèlement à ces défis pour consolider ma compréhension des concepts clés. J'ai appris des moyens plus efficaces de gérer certaines structures de données, comme les sections sur les listes chaînées et les arbres binaires. J’en suis venu à apprécier particulièrement l’approche dynamique de la plateforme pour enseigner et décomposer les problèmes de manière à les rendre faciles à digérer. C'est une excellente plate-forme pour apprendre le DSA à un niveau très basique, puis traduire cette compréhension en d'autres problèmes de codage auxquels je suis confronté.

Approches et techniques

Au fil des jours, j'ai rencontré de nombreux types d'approches de solution, des techniques de résolution de problèmes telles que

J'ai trouvé l'approche à deux pointeurs un moyen simple mais puissant de résoudre des problèmes impliquant des séquences (principalement des tableaux et des chaînes), en réduisant l'espace de recherche pour des solutions plus efficaces. J'ai également utilisé des algorithmes gloutons où je devais faire des choix localement optimaux à chaque étape.

Les techniques de fenêtre coulissante ont été une autre révélation : initialement difficiles, mais utiles pour les problèmes impliquant des sous-tableaux ou des sous-chaînes ; problèmes qui nécessitaient de garder la trace d’une gamme mobile d’éléments au sein d’une séquence. Les hashmaps et les tables de hachage sont idéales pour les paires clé-valeur dans les problèmes impliquant des recherches fréquentes.

L'une des techniques les plus complexes avec lesquelles j'ai travaillé était la programmation dynamique. Au début, j'ai trouvé DP assez intimidant en raison de la difficulté à reconnaître les sous-problèmes qui se chevauchent, mais avec des expositions répétées, la mémorisation est devenue mon meilleur ami pour optimiser les appels récursifs.

Manipulation de fonctions (feat. Wrappers et prototypes)

En plus des problèmes fondamentaux de DSA, j'ai également eu la chance d'essayer des concepts JavaScript plus avancés. J'ai écrit des fonctions wrapper, apprenant à contrôler le flux de mon code et à étendre les fonctionnalités pour des exigences spécifiques. J'ai même appris à définir des minuteries sur des fonctions, ce qui me permet de gérer des opérations urgentes ou de limiter la fréquence d'exécution de certaines fonctions.

Travailler avec des prototypes m'a montré que les types de données peuvent être manipulés au-delà de leurs capacités intégrées en créant des méthodes personnalisées. Cela m'a permis d'étendre les fonctionnalités intégrées des types de données tels que les objets et les tableaux de nouvelles manières. J'en suis venu à apprécier l'importance d'écrire du code propre et modulaire.

J'ai également appris la mémorisation, une technique où l'on modifie une fonction de telle sorte qu'elle stocke les arguments précédemment appelés avec leurs résultats ! Il s'agit d'une sorte de mise en cache qui permet d'améliorer les performances dans les problèmes où il y a plusieurs appels à la même fonction. J'ai écrit ici à propos de ma solution Memoize qui bat 99 % (mémoire) : La solution intuitive Memoize bat 99 % de mémoire.

Tests et optimisation

Une autre chose à laquelle j'ai commencé à prêter plus d'attention au cours de ce voyage était l'optimisation de mon code. Après une bonne introduction à la notation big-O sur Structy, j'ai compris l'importance de la complexité temporelle et spatiale et j'ai appris la technique optimale pour les problèmes les plus courants. Vers la fin du parcours de défi HackerRank, j'ai également appris à tester du code à l'aide de classes et à écrire des génériques.

Emporter

Au moment où j'ai terminé le défi 30 Days of Code, j'ai ressenti un profond sentiment de croissance. Cela a amélioré ma capacité à gérer un large éventail de problèmes et approfondi ma compréhension de JavaScript et de DSA. Plus que simplement résoudre des problèmes, ce voyage d’un mois m’a rappelé que je pouvais vraiment faire des efforts. Voyant les récompenses de la cohérence et de la discipline, j'ai été renouvelé avec l'état d'esprit nécessaire pour aborder n'importe quel défi avec confiance et une solide boîte à outils de techniques.

Cette expérience marque une étape importante dans mon parcours de programmation. Les compétences que j'ai développées au cours de ces 30 jours se poursuivront sans aucun doute dans ma carrière d'ingénieur logiciel.

Je suis fier de moi pour avoir déployé ces efforts et reconnaissant envers mes amis qui m'ont encouragé et offert leur soutien et leur sagesse tout au long du défi.

\\\"#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"}}
"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > #aysofCode septembre : Mon parcours vers la maîtrise du DSA

#aysofCode septembre : Mon parcours vers la maîtrise du DSA

Publié le 2024-11-07
Parcourir:913

En septembre, je me suis lancé dans un défi 30 jours de code, un engagement à résoudre au moins deux problèmes de structures de données et d'algorithmes (DSA) chaque jour. Mon objectif était de sortir de ma zone de confort, de renforcer la cohérence et d'améliorer mes compétences en résolution de problèmes et ma logique de programmation.

Je ne me suis pas contenté d'une seule plate-forme - j'ai complété le défi 30 Days of Code de HackerRank, le plan 30 Days of JavaScript de LeetCode, et j'ai également abordé la piste Top Interview 150 de LeetCode, une collection de 150 problèmes d'entretien typiques pour toute personne se préparant à un entretien de codage. De plus, j'ai suivi quelques cours sur Structy pour renforcer davantage ma compréhension des concepts DSA.

J'ai résolu la plupart des problèmes en utilisant JavaScript (à l'exception de quelques problèmes de HackerRank où JavaScript n'était pas pris en charge, j'ai donc utilisé Python à la place). Pour m'aider à rester responsable et à partager mes progrès, j'ai publié les défis que j'ai résolus chaque jour sur Twitter. Vous pouvez les retrouver dans ce parcours de citation :

Types de données, de base à avancé

Chaque jour m'a exposé à différents types de structures de données et d'algorithmes. J'ai appris à gérer

  • tableaux
  • chaînes
  • objets
  • cartes
  • ensembles
  • Nombres
  • booléens, et plus encore.

Certains problèmes impliquaient des structures plus complexes comme des listes chaînées et des arbres binaires, tandis que d'autres ajoutaient des matrices/des tableaux n-D dans le mélange, me permettant de gérer des espaces multidimensionnels.

La diversité des problèmes m'a tenu en haleine. Les problèmes sur la piste 30 jours de JavaScript de LeetCode m'ont fait découvrir des principes fondamentaux tels que

  • transformations de tableau
  • transformations de fonctions
  • fermetures
  • cours
  • JSON
  • Promesses et temps.

Le morceau Top Interview 150 de LeetCode est allé encore plus loin, me balançant entre des problèmes de difficulté et d'approche variables. Résoudre au moins un de ces problèmes chaque jour était inestimable. Ces problèmes m'ont également poussé à réfléchir plus souvent à l'optimisation et à la façon dont différentes approches pourraient affecter considérablement l'exécution et l'efficacité de la mémoire.

J'ai également suivi des cours de Structy parallèlement à ces défis pour consolider ma compréhension des concepts clés. J'ai appris des moyens plus efficaces de gérer certaines structures de données, comme les sections sur les listes chaînées et les arbres binaires. J’en suis venu à apprécier particulièrement l’approche dynamique de la plateforme pour enseigner et décomposer les problèmes de manière à les rendre faciles à digérer. C'est une excellente plate-forme pour apprendre le DSA à un niveau très basique, puis traduire cette compréhension en d'autres problèmes de codage auxquels je suis confronté.

Approches et techniques

Au fil des jours, j'ai rencontré de nombreux types d'approches de solution, des techniques de résolution de problèmes telles que

  • récursion
  • deux pointeurs
  • hashmap
  • table de hachage
  • algorithmes gourmands
  • recherche binaire
  • fenêtre coulissante
  • programmation dynamique
  • mise en cache (mémorisation), et plus encore.

J'ai trouvé l'approche à deux pointeurs un moyen simple mais puissant de résoudre des problèmes impliquant des séquences (principalement des tableaux et des chaînes), en réduisant l'espace de recherche pour des solutions plus efficaces. J'ai également utilisé des algorithmes gloutons où je devais faire des choix localement optimaux à chaque étape.

Les techniques de fenêtre coulissante ont été une autre révélation : initialement difficiles, mais utiles pour les problèmes impliquant des sous-tableaux ou des sous-chaînes ; problèmes qui nécessitaient de garder la trace d’une gamme mobile d’éléments au sein d’une séquence. Les hashmaps et les tables de hachage sont idéales pour les paires clé-valeur dans les problèmes impliquant des recherches fréquentes.

L'une des techniques les plus complexes avec lesquelles j'ai travaillé était la programmation dynamique. Au début, j'ai trouvé DP assez intimidant en raison de la difficulté à reconnaître les sous-problèmes qui se chevauchent, mais avec des expositions répétées, la mémorisation est devenue mon meilleur ami pour optimiser les appels récursifs.

Manipulation de fonctions (feat. Wrappers et prototypes)

En plus des problèmes fondamentaux de DSA, j'ai également eu la chance d'essayer des concepts JavaScript plus avancés. J'ai écrit des fonctions wrapper, apprenant à contrôler le flux de mon code et à étendre les fonctionnalités pour des exigences spécifiques. J'ai même appris à définir des minuteries sur des fonctions, ce qui me permet de gérer des opérations urgentes ou de limiter la fréquence d'exécution de certaines fonctions.

Travailler avec des prototypes m'a montré que les types de données peuvent être manipulés au-delà de leurs capacités intégrées en créant des méthodes personnalisées. Cela m'a permis d'étendre les fonctionnalités intégrées des types de données tels que les objets et les tableaux de nouvelles manières. J'en suis venu à apprécier l'importance d'écrire du code propre et modulaire.

J'ai également appris la mémorisation, une technique où l'on modifie une fonction de telle sorte qu'elle stocke les arguments précédemment appelés avec leurs résultats ! Il s'agit d'une sorte de mise en cache qui permet d'améliorer les performances dans les problèmes où il y a plusieurs appels à la même fonction. J'ai écrit ici à propos de ma solution Memoize qui bat 99 % (mémoire) : La solution intuitive Memoize bat 99 % de mémoire.

Tests et optimisation

Une autre chose à laquelle j'ai commencé à prêter plus d'attention au cours de ce voyage était l'optimisation de mon code. Après une bonne introduction à la notation big-O sur Structy, j'ai compris l'importance de la complexité temporelle et spatiale et j'ai appris la technique optimale pour les problèmes les plus courants. Vers la fin du parcours de défi HackerRank, j'ai également appris à tester du code à l'aide de classes et à écrire des génériques.

Emporter

Au moment où j'ai terminé le défi 30 Days of Code, j'ai ressenti un profond sentiment de croissance. Cela a amélioré ma capacité à gérer un large éventail de problèmes et approfondi ma compréhension de JavaScript et de DSA. Plus que simplement résoudre des problèmes, ce voyage d’un mois m’a rappelé que je pouvais vraiment faire des efforts. Voyant les récompenses de la cohérence et de la discipline, j'ai été renouvelé avec l'état d'esprit nécessaire pour aborder n'importe quel défi avec confiance et une solide boîte à outils de techniques.

Cette expérience marque une étape importante dans mon parcours de programmation. Les compétences que j'ai développées au cours de ces 30 jours se poursuivront sans aucun doute dans ma carrière d'ingénieur logiciel.

Je suis fier de moi pour avoir déployé ces efforts et reconnaissant envers mes amis qui m'ont encouragé et offert leur soutien et leur sagesse tout au long du défi.

#aysofCode September: My journey to DSA Mastery

Déclaration de sortie Cet article est reproduit sur : https://dev.to/akcumeh/30daysofcode-september-my-journey-to-dsa-mastery-647?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3