Michael0x2a/cse-143-16au-study-guide.md
Sådan studerer du
Programmering handler i høj grad om anvendt problemløsning og ikke om udenadslære.Det betyder, at den bedste måde at forberede sig til programmeringseksamen på ikke er ved at sidde ned og læse dias igennem – det er ved at løse en masse problemer.
Som følge heraf anbefaler jeg på det kraftigste, at du gør følgende, når du forbereder dig:
-
Forsøg at arbejde dig igennem mindst 3-4 programmeringsproblemer om dagen, fra nu af.
Der er ca. 12 dage tilbage til eksamen. Hvis du løser 4 problemer om dagen, vil du have løst ca. 30-50 problemer inden eksamen, hvilket vil give dig en GIGANTISK fordel i forhold til folk, der studerer i sidste øjeblik. Hvis du har en meget travl tidsplan, så prøv i det mindste at løse 1 problem om dagen.
Dette skyldes dels, at du vil have meget mere erfaring med at løse problemer end folk, der brammer i sidste øjeblik, og dels, at vi nogle gange bare genbruger problemerne til øvelsesprøven ved eksaminationen. Hvis du har 30-50 løste problemer i bagagen, er chancerne for at støde på et problem til eksamen meget større…
På denne måde har du også tid til at stille spørgsmål, hvis du støder på problemer, som du ikke kan løse.
Prøv at planlægge en time hver dag i din kalender, hvor du planlægger at sætte dig ned og arbejde dig igennem problemerne. (Sørg også for at begynde på HW 8 tidligt, så du har masser af tid til både at studere OG lave dine HW).
-
Planlæg en dag, hvor du sætter dig ned og løser en række problemer fra et mystisk emne.
Du bør forsøge at øve dig så meget, at du kan løse de mystiske problemer pålideligt og med 100 % nøjagtighed. Det kan være mere produktivt at sætte sig ned en dag og løse en masse opgaver på en gang, så du kan øve dig. (Prøv f.eks. i weekenden at lave en masse polymorfismeproblemer)
-
Forsøg at løse øvelsesopgaverne i ét hug. Lad være med at “redigere og kompilere igen”.
I den endelige prøve har du ikke en compiler til at kontrollere dit arbejde. Gør dit bedste for at løse problemerne i dit første forsøg. Brug blyant og papir til at gennemregne problemerne, før du trykker på “submit”-knappen.
Hvis du ikke får løst de praktiske problemer korrekt i første forsøg, betyder det, at du har brug for meget mere øvelse.
(Når det er sagt, skal du til at begynde med primært fokusere på at få løst dine problemer korrekt til at begynde med.Når du er relativt fortrolig med et emne, kan du prioritere at få løst problemerne korrekt i første forsøg).
-
Før en løbende liste over “ting, du skal forbedre”.
Når du begår en fejl, overser noget eller bemærker, at du er forvirret, så skriv det ned.Brug din løbende liste over fejl til at hjælpe dig med at guide dig til, hvilke problemtyper du har problemer med, og hvad du skal studere mere.
For eksempel kan du opdage, at du nogle gange får øvelses-it-problemer forkert, fordi du glemmerat tilføje en undtagelseskontrol. Det kan tyde på, at du ved eksamen skal være ekstra omhyggelig med at læse instruktionerne.
Og måske finder du ud af, at du har problemer med problemer med linkede lister, hvor du skal bearbejde to linkede lister. Det er måske en god ting at bede en AT om hjælp til.
-
Produktiv kamp er godt; uproduktiv kamp er dårligt.
Det er normalt at kæmpe, når man arbejder med problemer. Men prøv at have “produktiv “kamp, ikke “uproduktiv” kamp. Hvis du arbejder på et problem og føler, at du gør stadige fremskridt (selv om det er langsomt), så er det “produktiv” kamp.
Hvis du derimod sidder fast og har tyet til at foretage tilfældige ændringer for at se, om de virker, er det “uproduktiv” kamp. Hvis du når til det “uproduktive” stadium, så bør du lægge problemet til side, tage en pause, prøve at arbejde på et andet problem, prøve at bede nogen om hjælp osv….
Samlingsproblemer
Binary Tree Traversal and Insertion problems
Du kan finde nogle øvelsesproblemer her: http://practiceit.cs.washington.edu/problem/search?keyword=tree+traversals
Problem 5 på alle øvelsesprøverne indeholder også disse problemtyper.
I den endelige prøve skal du forsøge at bruge højst ~5 minutter hver på disse problemer (altså ~10 min i alt)med en nøjagtighed på `00%.
Collections mystery
Jeg kunne kun finde to collections mystery-opgaver, der involverer maps, på øve-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
På dette emne foreslår jeg, at du sikrer dig, at du forstår, hvordan præcis følgende datastruktureropfører sig, hvor effektive deres forskellige metoder er, og hvordan de adskiller sig fra hinanden:
- ArrayList
- LinkedList
- Stack
- Stack
- Queue
- TreeSet
- HashSet
- TreeMap
- HashMap
Polymorphism mystery
Du kan finde nogle øvelsesopgaver her: http://practiceit.cs.washington.edu/problem/search?keyword=polymorphism&language=
Du bør tage dig god tid til at løse disse problemer i den endelige prøve for at sikre dig, at du ikke begår en dum fejl.
Når du arbejder på disse problemer, skal du sikre dig, at du har en solid begrebsmæssig forståelse af, hvad der foregår. Det snydeark, som vi udleverede på afsnittet, bør være meget nyttigt.
Programmeringsproblemer
For de binære træ- og linked list-spørgsmål har jeg sorteret spørgsmålene groft efter sværhedsgrad.Jeg vil kraftigt anbefale dig at prioritere at løse de mellem- til svære spørgsmål først, og kun prøve de lette til svære spørgsmål, hvis du har problemer med de sværere.
Disclaimer: Jeg vurderede sværhedsgraden ved at se problemerne i øjenhøjde. Jeg kan have overset nogle spørgsmål, der gør dem lettere eller sværere, end jeg oprindeligt troede.
Comparable Programming
Dette problem kræver, at du implementerer hele klassen: http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/Office
De følgende opgaver kræver, at du kun skal implementere compareTo-metoden. Jeg vil anbefale, at du alligevel forsøger at skrive hele klassen, da det er det, du sandsynligvis vil blive bedt om at gøre i eksamensprøven.
Opmærksomhed: Practice-it har nogle flere problemer om dette emne, men jeg håndplukkede dem, der så lidt mere komplekse ud. Nogle Comparable-problemer på practice-it beder dig om at udvide en klasse ud over at implementere Comparable — det bliver du ikke bedt om at gøre i dette kvartals eksamen.
- 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
Binary Tree Programming (traversal)
Note: praksis-it har en flere problemer, men jeg håndplukkede nogle af dem, der så gode ud/virkede tricky. Practice finals har også nogle gode spørgsmål, selvom der vil være en del overlap med practice-it. Som nævnt ovenfor, prioriterer du at arbejde med de sværere.
Let til medium:
- 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
Middel til svært:
- 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
Binær træprogrammering (modifikation)
Samme som ovenfor — praksis- det har flere problemer, Jeg valgte interessante, øvelsesprøver hargode spørgsmål med noget overlap, prioriterer at arbejde med udfordrende problemer.
For dette emne er det helt afgørende, at du har en god forståelse afx = change(x)
-mønstret. Stilvejledningen har nogle noter om x = change(x)
her (for det meste er der en liste over en række ting, du ikke bør gøre/har nogle eksempler), som kan være nyttige.
Disclaimer: sondringen mellem “medium” og “svære” spørgsmål blev lidt sløret her for mig,så idk om de virkelig er sorteret korrekt.
Let til medium:
- http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/removeLeaves
- http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e20%2DmakePerfect
- Denne opgave giver dig en “højde”-metode. Du bør prøve at skrive “height”-metoden selv her: 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
Mellem til svær:
- 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
Programmering af linkede lister
Samme som ovenfor.
Og hvis du nogensinde kommer til at tænke “Hold da op, jeg ville ønske jeg kunne bruge en ekstra stak” når du arbejder på et linked list problem, er det ofte en indikator på at linked list problemet vil være nemmere hvis du prøvede at løse det rekursivt.
Når du løser et problem rekursivt, kan du “gemme” variabler og information på hvert niveau/på hver stakramme — dette giver dig dybest set en implicit hjælpestak.
Det at have en (implicit) stak vil dog ikke nødvendigvis være nyttigt for alle linked list-problemer, så prøv ikke at tvinge rekursion ind på steder, hvor det ikke virker naturligt.
Det sagt, skal du huske på, at du kan erstatte kode, der bruger loops, med kode, der bruger rekursion, og omvendt, med en tilstrækkelig indsats. (Spørgsmålet er, om det faktisk er en god idé at gøre det…)
Let til medium:
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/min
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/lastIndexOf
Forsøg at gøre dette rekursivt!
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/countDuplicates
Sørg for at udnytte, hvordan listen er sorteret
-
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
Middel til svært:
-
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
Prøv at gøre dette både rekursivt og iterativt!
-
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