Michael0x2a/cse-143-16au-study-guide.md

Cum să studiezi

Programarea, în mare măsură, se referă la rezolvarea aplicată a problemelor și nu la memorare.Aceasta înseamnă că cel mai bun mod de a te pregăti pentru examenele de programare nu este să stai jos și să citești ghidurile – ci să rezolvi o mulțime de probleme.

În consecință, vă recomand cu tărie să faceți următoarele atunci când vă pregătiți:

  1. Încercați să lucrați cu minim 3 sau 4 probleme de programare pe zi, începând de acum.

    Au mai rămas aproximativ 12 zile până la examen. Dacă rezolvi 4 probleme pe zi, vei fi rezolvataproximativ 30-50 de probleme până la examen, ceea ce îți va da un avantaj GIGANTIC față de cei care studiază în ultimul moment. Dacă aveți un program foarte încărcat, încercați să faceți cel puțin 1 problemă pe zi.

    Acest lucru se datorează parțial faptului că veți avea mult mai multă experiență în rezolvarea problemelor decât persoanele care se înghesuie în ultimul moment, și parțial pentru că, uneori, refolosim pur și simplu problemele de la practică la examenul final. Dacă aveți 30-50 de probleme rezolvate sub centură, șansele de a întâlni unreebie la examen sunt mult mai mari…

    În acest fel, veți avea, de asemenea, timp să puneți întrebări dacă dați peste probleme care vă blochează.

    Încercați să vă programați un bloc de 1 oră în fiecare zi în calendarul dvs. în care plănuiți doar să stați jos,și să lucrați la probleme. (De asemenea, asigurați-vă că începeți HW 8 mai devreme, pentru a vă asigura că aveți suficient timp atât pentru a studia cât și pentru a vă face HW).

  2. Alocarea unei zile în care să stați jos și să lucrați la o serie de probleme dintr-un subiect misterios.

    Ar trebui să încercați să exersați până la punctul în care puteți completa problemele misterioase în mod fiabil și cu o precizie de 100%. S-ar putea să fie mai productiv să stați jos într-o zi și să lucrați la o grămadă deodată, astfel încât să puteți exersa. (De exemplu, în acest weekend, poate încercați să faceți o grămadă de probleme de polimorfism)

  3. Încercați să rezolvați problemele de practică dintr-o singură lovitură. Nu „editați și recompilați”.

    La examenul final, nu veți avea un compilator care să vă verifice munca. Faceți tot posibilul să rezolvați problemele din prima încercare. Folosiți creionul și hârtia pentru a raționaliza problemele înainte de a apăsa acel buton „submit”.

    Dacă nu reușiți în mod fiabil să rezolvați corect problemele de practică din prima încercare, înseamnă că aveți nevoie de mult mai multă practică.

    (Acestea fiind spuse, pentru început, concentrați-vă în principal pe rezolvarea corectă a problemelor pentru început.Odată ce vă simțiți relativ confortabil cu un subiect, acordați prioritate rezolvării corecte a problemelor din prima încercare).

  4. Păstrați o listă curentă a „lucrurilor pe care trebuie să le îmbunătățiți”.

    Când faceți o greșeală, treceți ceva cu vederea sau observați că sunteți confuz, notați-o. Folosiți lista curentă a greșelilor pentru a vă ghida cu privire la tipurile de probleme cu care aveți probleme și la ceea ce trebuie să studiați mai mult.

    De exemplu, s-ar putea să constatați că uneori greșiți problemele de practică pentru că ați uitat să adăugați o verificare a excepțiilor. Acest lucru ar putea indica faptul că, la examenul final, ar trebui să fiți foarte atenți la citirea instrucțiunilor.

    Orice, ați putea constata că aveți dificultăți cu problemele de liste legate în care trebuie să lucrați peste două liste legate. Acesta ar putea fi un lucru bun pentru care să cereți ajutorul unui AT.

  5. Lupta productivă este bună; lupta neproductivă este rea.

    Este normal să vă luptați atunci când lucrați la probleme. Totuși, încercați să aveți o luptă „productivă „și nu o luptă „neproductivă”. Dacă lucrați la o problemă și simțiți că faceți un progres constant (chiar dacă este lent), atunci aceasta este o luptă „productivă”.

    Dar, dacă sunteți blocat și ați recurs la schimbări aleatorii pentru a vedea dacă funcționează,aceasta este o luptă „neproductivă”. Dacă ați ajuns în stadiul „neproductiv”, atunci ar trebui să lăsați problema deoparte, să luați o pauză, să încercați să lucrați la o altă problemă, să încercați să cereți ajutorul cuiva, etc…

Probleme de colecție

Probleme de traversare și inserție în arbore binar

Puteți găsi câteva probleme practice aici: http://practiceit.cs.washington.edu/problem/search?keyword=tree+traversals

Problema 5 de la toate examenele practice are, de asemenea, aceste tipuri de probleme.

La examenul final, încercați să petreceți doar maxim ~5 minute pentru fiecare din aceste probleme (deci ~10 min în total)cu o precizie de `00%.

Colecții misterioase

Am reușit să găsesc doar două probleme de colecții misterioase care implică hărți pe practice-it:

  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/collectionMystery
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final7/collectionMystery

Pentru acest subiect, vă sugerez să vă asigurați că înțelegeți cum anume se comportă următoarele structuri de date, cât de eficiente sunt diversele lor metode și cum diferă unele de altele:

  • ArrayList
  • LinkedList
  • Stack
  • Queue
  • TreeSet
  • HashSet
  • .

  • TreeMap
  • HashMap

Misterul polimorfismului

Aici puteți găsi câteva probleme practice: http://practiceit.cs.washington.edu/problem/search?keyword=polymorphism&language=

Ar trebui să nu vă grăbiți cu aceste probleme la examenul final pentru a vă asigura că nu faceți o greșeală prostească.

Când lucrați la aceste probleme, asigurați-vă că aveți o înțelegere conceptuală solidă a ceea ce se întâmplă. Fișa pe care am înmânat-o la secțiune ar trebui să vă fie foarte utilă.

Probleme de programare

Pentru întrebările privind arborele binar și listele legate, am sortat întrebările aproximativ în funcție de dificultate.V-aș recomanda cu tărie să acordați prioritate rezolvării mai întâi a întrebărilor de dificultate medie spre grea și să încercați întrebările ușoare spre dificile doar dacă aveți dificultăți cu cele mai dificile.

Disclaimer: Am evaluat dificultatea printr-un fel de verificare vizuală a problemelor. S-ar putea să fi omisnuanțe la anumite întrebări care să le facă mai ușoare sau mai dificile decât am crezut inițial.

Programare comparabilă

Această problemă vă cere să implementați întreaga clasă: http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/Office

Problemele următoare vă cer să implementați doar metoda compareTo. V-aș recomanda să încercați oricum să scrieți clasa completă, din moment ce asta vi se va cere probabil să faceți la examenul final.

Nota: practice-it are mai multe probleme pe această temă, dar eu le-am ales manual pe cele care păreau puțin mai complexe. Unele probleme Comparable de pe practice-it vă cer să extindeți o clasă în plus față de implementarea Comparable – nu vi se va cere să faceți acest lucru la examenul final din acest trimestru.

  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/midterms/midterm1/BankAccount
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/midterms/midterm3/Food
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/midterms/midterm4/MovieRating
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/midterms/midterm5/Pokemon
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/comparable/Location
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/midterms/midterm2/Rational

Programare în arbori binari (traversare)

Note: practică-are mai multe probleme, dar am ales manual câteva care păreau bune/parau dificile. Examenul final de practică are, de asemenea, câteva întrebări bune, deși vor exista unele suprapuneri cu practica-it. Așa cum s-a spus mai sus, acordați prioritate lucrului la cele mai dificile.

Facil până la mediu:

  • http://practiceit.cs.washington.edu/problem/view/bjp3/chapter17/e18%2DinOrderList
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/countLeaves
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/height
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/isFull
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/printLevel

Mediu până la greu:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/depthSum
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/numEmpty
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/printLeaves
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/evenBranches
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final2/countMultiples
  • http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e9%2Dequals

Programarea arborelui binar (modificare)

La fel ca mai sus – în practică – are mai multe probleme, am ales unele interesante, examenele de practică auîntrebări bune cu unele suprapuneri, acordați prioritate lucrului la probleme dificile.

Pentru acest subiect, este absolut esențial să aveți o bună înțelegere a modeluluix = change(x). Ghidul de stil are câteva note despre x = change(x) aici (în principal, enumeră o grămadă de lucruri pe care nu ar trebui să le faceți/are câteva exemple) care ar putea fi de ajutor.

Disclaimer: Distincția dintre întrebările „medii” și „dificile” a devenit cam neclară aici pentru mine, așa că nu știu dacă sunt cu adevărat sortate corect.

Facil până la mediu:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/removeLeaves
  • http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e20%2DmakePerfect
    • Această problemă vă oferă o metodă de „înălțime”. Ar trebui să încercați să scrieți singur metoda „height” aici: http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/height
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final5/flip
  • http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e17%2DcombineWith
  • http://practiceit.cs.washington.edu/problem/view/bjp3/chapter17/e19%2DevenLevels

Mediu spre greu:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/tighten
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/completeToLevel
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/construct
  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/limitPathSum
  • http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e15%2Dtrim
  • http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final6/removeMatchingLeaves

Programarea listelor legate

La fel ca mai sus.

De asemenea, dacă vă găsiți vreodată gândindu-vă „Doamne, aș vrea să pot folosi o stivă auxiliară” atunci când lucrați la o problemă de listă legată, acesta este adesea un indicator că problema de listă legată va fi mai ușoară dacă ați încerca să o rezolvați recursiv.

Când rezolvați o problemă în mod recursiv, puteți „stoca” variabile și informații pe fiecare nivel/pe fiecare cadru al stivei – acest lucru vă oferă practic o stivă auxiliară implicită.

Având o stivă (implicită) nu va fi neapărat utilă pentru toate problemele de liste legate, totuși,așa că nu încercați să forțați recursivitatea în locuri în care nu pare naturală.

Acestea fiind spuse, rețineți că puteți înlocui codul care folosește bucle cu cod care folosește recursivitatea și invers, cu suficient efort. (Întrebarea este dacă este de fapt o idee bună să faci asta…)

De la ușor la mediu:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/min

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/lastIndexOf

    Încercați să faceți asta în mod recursiv!

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/countDuplicates

    Asigură-te că exploatezi modul în care este sortată lista

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/transferFrom

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/equals

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/doubleList

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/switchPairs

Mediu spre greu:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/split

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/removeRange

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/reverse

    Încercați să faceți acest lucru atât recursiv cât și iterativ!

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/takeSmallerFrom

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/removeAll

Leave a Reply