Στις 26 Αυγούστου 2022, ξεκίνησα το ταξίδι μου στο Leetcode. Από τότε, σε λίγο περισσότερο από 12 ημέρες, έχω ολοκληρώσει περίπου 100 προβλήματα. Εδώ είναι λίγα για μένα και τι έχω μάθει μέχρι τώρα.

Λίγα για μένα:

Είμαι απόφοιτος γυμνασίου με ελάχιστη έως καθόλου εμπειρία κωδικοποίησης. Πήρα το AP Computer Science A στο γυμνάσιο και το απόλαυσα, και μετά την αποφοίτησή μου, κατέληξα στο Flatiron School, ένα συναρπαστικό bootcamp κωδικοποίησης.

Πάντα ασχολιόμουν πραγματικά με την επίλυση προβλημάτων. Έκανα ανταγωνιστικά μαθηματικά για 6 χρόνια και όταν άκουσα για το leetcode, ενθουσιάστηκα. Πήδηξα στην πλατφόρμα μόλις μπορούσα και τα υπόλοιπα είναι ιστορία (αυτό ήταν πριν από δύο εβδομάδες).

Από τότε, έχω επιλέξει μερικές συμβουλές και κόλπα που μπορεί να είναι χρήσιμα τόσο για αρχάριους που προσπαθούν να πάρουν τον κώδικα leetcode όσο και για τον εαυτό μου – πολύ ακόμα αρχάριο – για να κοιτάξω πίσω για να προχωρήσω μπροστά.

  1. Ξέρετε περισσότερα από όσα νομίζετε

Όταν ξεκίνησα για πρώτη φορά το leetcode, ανησυχούσα πολύ ότι οι δομές δεδομένων θα ήταν ένα μεγάλο εμπόδιο για μένα. Μόλις είχα αρχίσει να μαθαίνω κώδικα και αν τα αντικείμενα ήταν ήδη τόσο δυσνόητα, ένα hashmap θα ήταν πιθανότατα δέκα φορές πιο δύσκολο.

Αλλά όπως αποδεικνύεται, τα hashmaps είναι κυριολεκτικά απλά είδη αντικειμένων! Και αυτό ισχύει για πολλές περισσότερες δομές δεδομένων από ό,τι θα φαντάζεστε αρχικά. Hashmaps, ουρές, στοίβες, κ.λπ. είναι όλα μεγάλοι όροι και ιδέες, αλλά στην πραγματικότητα, είναι απλώς μορφές εννοιών που ήδη γνωρίζετε, όπως πίνακες και αντικείμενα. Μην αφήνετε τη φρασεολογία να σας αποθαρρύνει από το να ξεκινήσετε ή να προσπαθήσετε να μάθετε κάτι νέο – εάν έχετε κάνει οποιοδήποτε είδος κώδικα, πιθανότατα γνωρίζετε ήδη περισσότερα από ό,τι νομίζετε.

(Εκτός από δυαδικά δέντρα. Φίλε, πραγματικά δεν έχω δυαδικά δέντρα).

2. Ειλικρινά… η λύση σας μάλλον είναι χάλια.

Προερχόμενος από ανταγωνιστικό υπόβαθρο μαθηματικών, ποτέ δεν σκέφτηκα πράγματα όπως η πολυπλοκότητα. Γιατί θα με ενδιαφέρει η λύση μου να είναι αποτελεσματική αν ήταν σωστή; Ο στόχος ήταν πάντα να λύσω όσα περισσότερα προβλήματα μπορούσα στον ελάχιστο χρόνο, και αν αυτό σήμαινε να επιβάλλω ανόητα βάναυσα ένα πρόβλημα επειδή ξέχασα μια φόρμουλα, τότε ας είναι.

Φυσικά, όταν πάτησα το leetcode, άρχισα να κάνω το ίδιο. Συνάντησα μερικά εύκολα προβλήματα και άρχισα αμέσως να αποσύρω τον κώδικα. Αλλά αφού έλυσα ίσως περίπου 5-7 από τα πιο έξυπνα, πέτυχα ένα μπλοκ αρκετά γρήγορα.

Όπως αποδεικνύεται, οι πιο διαισθητικές απαντήσεις συνήθως δεν είναι οι καλύτερες! Μακριά από, στην πραγματικότητα. Συνήθως, ακόμη και οι πιο εύκολες ερωτήσεις σχετικά με το leetcode έχουν λύσεις που είναι αρκετά δύσκολο να κατανοήσουν οι αρχάριοι. Για παράδειγμα, η επίλυση δύο αθροισμάτων (πιθανώς το πιο διάσημο πρόβλημα leetcode) απαιτεί να μάθετε τι είναι τα hashmaps και πώς να τα χρησιμοποιείτε.

Οι λύσεις που βρίσκετε ως αρχάριος και οι λύσεις που εξακολουθώ να βρίσκω, είναι τις περισσότερες φορές μη βελτιστοποιημένες.

Ειδικά όταν ξεκινάτε, είναι εξαιρετικά σημαντικό να φροντίσετε να κοιτάξετε τις λύσεις που δίνονται και να καταλάβετε πώς λειτουργεί η βέλτιστη λύση πριν προχωρήσετε.

3. Μιλήστε το!

Κάτι που άκουγα συχνά ήταν για το πόσο σημαντικό ήταν να μιλήσεις για τα προβλήματά σου (τόσο με το leetcode όσο και με τον πραγματικό κόσμο).

Αλλά όντας τόσο μεγαλόψυχος όσο είμαι, αγνόησα αμέσως αυτή την άκρη, νομίζοντας ότι δεν ίσχυε για μένα. Τα πήγαινα καλά και μόνο που το σκέφτηκα καθώς έφτασα τόσο μακριά — γιατί θα έπρεπε να μιλήσω για κάτι;

Αλλά μόλις άρχισα να αντιμετωπίζω πιο δύσκολα προβλήματα και να προσπαθώ πιο σκληρά εύκολα και μεσαία, έχασα αμέσως την αίσθηση των λύσεών μου. Συχνά, είχα την απάντηση στο μυαλό μου, αλλά θα πνιγόταν από τις πολλές μεταβλητές και τους βρόχους που είχα γράψει στον κώδικά μου.

Μόλις άκουσα τις διαδικτυακές συμβουλές και άρχισα να εξηγώ το πρόβλημά μου δυνατά, η όλη δοκιμασία έγινε πολύ πιο απλή. Κάθε μικρό βήμα που έκανα για να βοηθήσω στην οπτική σύλληψη της ερώτησης το έκανε πολύ πιο εύκολο.

Έτσι, ένας πολύ καλός τρόπος για να διατηρήσετε τον κώδικά σας τακτοποιημένο (και καλή πρακτική συνεντεύξεων επίσης, έτσι ακούω) είναι να μιλήσετε για τον κώδικά σας! Κατανοήστε πλήρως τι πρόκειται να κάνετε πριν ξεκινήσετε να γράφετε κώδικα και υπόσχομαι ότι η πραγματική κωδικοποίηση θα περάσει πολύ πιο γρήγορα.

4. Ομαδοποιήστε τις ερωτήσεις σε έννοιες

Καθώς ξεκινάτε να λύνετε ερωτήσεις, σύντομα συνειδητοποιείτε ότι υπάρχουν μοτίβα στις περισσότερες ερωτήσεις. Υπάρχουν ένα εκατομμύριο μαθήματα στο διαδίκτυο που μιλούν για καθεμία από αυτές τις έννοιες σε βάθος και το leetcode προσφέρει ακόμη και φίλτρα ανά έννοιες.

Αυτό που πραγματικά με βοήθησε ήταν πραγματικά να προσπαθώ να μάθω έννοιες μία κάθε φορά. Ξεκίνησα δοκιμάζοντας όσο περισσότερα εύκολα μπορούσα και απλώς παρακάμπτοντας ερωτήσεις μέχρι να βρω ένα άλλο εύκολο που θα μπορούσα να λύσω. Αν και αυτό σίγουρα με βοήθησε να φτάσω γρήγορα το ορόσημο των 100 ερωτήσεών μου, πραγματικά δεν με δίδαξε τόσα πολλά.

Ένας πολύ καλύτερος τρόπος για να μάθετε ήταν να εστιάσετε σε μεμονωμένες έννοιες κάθε φορά. Και αυτό έχει νόημα και διαισθητικά. Θέλω να πω, στο σχολείο δεν μαθαίνεις δέκα έννοιες ταυτόχρονα. πας μονάδα με μονάδα.

Το ίδιο ισχύει και για τον κώδικα. Εάν επιχειρήσετε μερικά προβλήματα με το ίδιο γενικό μοτίβο (όπως δυαδική αναζήτηση) και μια δημιουργική αλλαγή σε καθένα από αυτά, το μοτίβο θα κολλήσει πολύ πιο γρήγορα από ό,τι αν κάνατε ένα πρόβλημα τυχαίας δυαδικής αναζήτησης αφού προσπαθήσατε να καταλάβετε πώς να αντιστρέψετε ένα συνδεδεμένη λίστα για 2 ώρες.

5. Μην αποφεύγετε τα δύσκολα προβλήματα

Αυτό είναι ένα γενικό θέμα στις περισσότερες από τις συμβουλές μου, αλλά επειδή κάτι είναι δύσκολο δεν σημαίνει ότι δεν πρέπει να το δοκιμάσετε. Συχνά θα μάθετε πολύ περισσότερα από πιο δύσκολα προβλήματα παρά από ευκολότερα προβλήματα.

Όταν άρχισα να λύνω προβλήματα, είχα επισημάνει το ~80% όλων των προβλημάτων που είχα αντιμετωπίσει ως προβλήματα που έπρεπε οπωσδήποτε να εξετάσω αργότερα, επειδή απλώς δεν τα κατάλαβα.

Αλλά αφού αφιερώσαμε μερικές μέρες κοιτάζοντας πιο δύσκολες παραλλαγές αυτών των προβλημάτων και προσπαθώντας να ακολουθήσουμε μαζί με λύσεις βίντεο (το Neetcode στο YouTubee είναι κάτι παραπάνω από εκπληκτικό για αυτό), αυτά τα ίδια αδύνατα προβλήματα έγιναν πολύ πιο λογικά — εύκολα, ακόμη και. Προσπαθήστε να λύσετε δύσκολα προβλήματα και οι υποκείμενες έννοιες θα κάνουν κλικ πολύ πιο γρήγορα.

6. Κάντε το ξανά… και ξανά

Μην κοιτάτε απλώς μια λύση και σκέφτεστε «ναι, το κατάλαβα» και προχωρήστε. Εάν υπάρχει κάποια ερώτηση στην οποία σκόνταψες ή χρειάστηκε να αναζητήσετε μια λύση, κάντε την ξανά.

Όπως οι περισσότεροι άνθρωποι που μαθαίνουν κώδικα πιθανότατα ήδη γνωρίζουν, μαθαίνεις πιο γρήγορα κάνοντας, όχι βλέποντας. Συχνά, η λογική του κώδικα μπορεί να φαίνεται προφανής στη λύση ενός άλλου ατόμου, αλλά γίνεται απίστευτα δύσκολο να αναδημιουργηθεί όταν αφεθείτε στις δικές σας συσκευές. Ξαναγράψτε τις λύσεις μόλις τις καταλάβετε και όταν το κάνετε αυτό, σβήστε τις όλες και κάντε το ξανά!

Αυτό όχι μόνο θα σας βοηθήσει να θυμάστε καλύτερα τη λύση για την επόμενη φορά, αλλά θα γεμίσει τυχόν τρύπες στην κατανόησή σας. Υπάρχουν πολλές λύσεις στο Διαδίκτυο που στην πραγματικότητα λειτουργούν λίγο διαφορετικά από ό,τι νομίζατε αρχικά (ένας βρόχος for μπορεί να επαναλαμβάνεται μέσω διαφορετικής διάταξης από ό,τι νομίζατε, μια μεταβλητή μπορεί να αυξάνεται και δεν το ξέρατε καν). Προσπαθώντας να βρείτε τη λύση αφού την έχετε δει θα σας βοηθήσει να γεμίσετε αυτά τα κενά.

Συμπέρασμα

Στο τέλος της ημέρας, λάβετε τη συμβουλή μου με λίγο αλάτι. Είμαι ακόμα αρκετά ανυπόμονος με τις λύσεις μου και αγωνίζομαι όλη την ώρα. Είμαι λίγο καλύτερα από όταν ξεκίνησα, αλλά είμαι ακόμα πολύ αρχάριος. Το Leetcode είναι δύσκολο και προκλητικό, αλλά μπορεί να είναι πολύ διασκεδαστικό - σίγουρα ήταν για μένα.

Καλή τύχη!