Michael0x2a/cse-143-16au-study-guide.md
Hur man studerar
Programmering handlar i stor utsträckning om tillämpad problemlösning och inte om att memorera.Det betyder att det bästa sättet att förbereda sig för programmeringsexamen inte är att sitta ner och läsa igenom bildspel – det är genom att lösa en massa problem.
Som ett resultat av detta rekommenderar jag starkt att du gör följande när du förbereder dig:
-
Sök att arbeta igenom minst 3-4 programmeringsproblem per dag, med början nu.
Det är ungefär 12 dagar kvar till provet. Om du löser fyra problem per dag kommer du att ha löst ungefär 30-50 problem till tentamen, vilket ger dig en GIGANTISK fördel jämfört med personer som studerar i sista minuten. Om du har ett mycket fullspäckat schema kan du åtminstone försöka lösa ett problem per dag.
Detta beror delvis på att du har mycket mer erfarenhet av att lösa problem än de som pluggar i sista minuten och delvis på att vi ibland bara återanvänder problem i praktiken på tentamen. Om du har 30-50 lösta problem i bagaget är sannolikheten att du stöter på ett problem på provet mycket större…
På detta sätt har du också tid att ställa frågor om du stöter på problem som inte går att lösa.
Pröva att schemalägga en timmes tid varje dag i din kalender där du planerar att bara sitta ner och arbeta med problem. (Se också till att börja med HW 8 tidigt, så att du har gott om tid att både studera och göra dina HW).
-
Planera en dag då du sätter dig ner och löser ett antal problem från ett mysterieämne.
Du bör försöka öva dig så mycket att du kan lösa mysterieproblemen på ett tillförlitligt sätt och med 100 % noggrannhet. Det kan vara mer produktivt att bara sätta sig ner en dag och arbeta igenom en massa på en gång så att du kan öva. (Till exempel, i helgen kanske du kan försöka göra ett gäng problem med polymorfism)
-
Försök att lösa övningsuppgifter i ett svep. Redigera och kompilera inte på nytt.
I finalen kommer du inte att ha någon kompilator för att kontrollera ditt arbete. Gör ditt bästa för att lösa problemen på första försöket. Använd penna och papper för att resonera kring problemen innan du trycker på ”skicka”-knappen.
Om du inte på ett tillförlitligt sätt får rätt på dina övningsuppgifter på första försöket betyder det att du behöver mycket mer övning.
(Med det sagt, fokusera till att börja med främst på att få rätt på dina problem till att börja med.När du väl är relativt bekväm med ett ämne kan du prioritera att få rätt på dina problem på första försöket).
-
För en löpande lista över ”saker du behöver förbättra”.
När du gör ett misstag, förbiser något eller märker att du är förvirrad, skriv ner det.Använd din löpande lista över misstag för att hjälpa dig att guida dig om vilka problemtyper du har problem med och vad du behöver studera mer.
Du kanske till exempel upptäcker att du ibland får fel på övnings-it-problem för att du glömmeratt lägga till en undantagskontroll. Det kan tyda på att du på slutprovet bör vara extra noga med att läsa instruktionerna.
Och du kanske upptäcker att du har svårt att lösa problem med länkade listor där du måste bearbeta två länkade listor. Det kan vara bra att be en lärare om hjälp.
-
Produktiv kamp är bra; improduktiv kamp är dåligt.
Det är normalt att kämpa när man arbetar med problem. Försök dock att ha ”produktiv” kamp, inte ”improduktiv” kamp. Om du arbetar med ett problem och känner att du gör stadiga framsteg (även om det går långsamt) är det ”produktiv” kamp.
Om du däremot sitter fast och har tillgripit slumpmässiga ändringar för att se om de fungerar är det ”improduktiv” kamp. Om du hamnar på det ”improduktiva” stadiet bör du lägga problemet åt sidan, ta en paus, försöka arbeta med ett annat problem, försöka be någon om hjälp osv.
Samlingsproblem
Binary Tree Traversal and Insertion problems
Du kan hitta några övningsproblem här: http://practiceit.cs.washington.edu/problem/search?keyword=tree+traversals
Problem 5 på alla övningsprov innehåller också dessa problemtyper.
På slutprovet ska du försöka ägna högst ~5 minuter åt vart och ett av dessa problem (alltså ~10 minuter totalt) med en noggrannhet på 100 %.
Collections mystery
Jag kunde bara hitta två collections mystery problem som involverar kartor på övningsutgåvan:
- http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/collectionMystery
- http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final7/collectionMystery
För det här ämnet föreslår jag att du ser till att du förstår exakt hur följande datastrukturer beter sig, hur effektiva deras olika metoder är, och hur de skiljer sig från varandra:
- ArrayList
- LinkedList
- Stack
- Queue
- TreeSet
- HashSet
- TreeMap
- HashMap
Polymorfism mysterium
Du kan hitta några övningsuppgifter här: http://practiceit.cs.washington.edu/problem/search?keyword=polymorphism&language=
Du bör ta god tid på dessa problem för att vara säker på att du inte gör något dumt misstag.
När du arbetar med dessa problem, se till att du har en gedigen begreppsförståelse av vad som händer. Fuskbladet som vi delade ut på avsnittet bör vara mycket användbart.
Programmeringsproblem
För frågorna om binära träd och länkade listor har jag sorterat frågorna grovt efter svårighetsgrad.Jag rekommenderar starkt att du prioriterar att lösa de medelsvåra till svåra frågorna först, och att du bara försöker med de lätta till svåra frågorna om du har problem med de svårare.
Disclaimer: Jag bedömde svårighetsgraden genom att på sätt och vis titta på problemen med ögonen. Jag kan ha missat nyanser i vissa frågor som gör dem lättare eller svårare än jag ursprungligen trodde.
Comparable Programming
Detta problem kräver att du implementerar hela klassen: http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/Office
Följande problem kräver att du endast implementerar metoden compareTo. Jag rekommenderar att du försöker skriva hela klassen ändå, eftersom det är vad du troligen kommer att bli ombedd att göra i slutprovet.
Note: practice-it har några fler problem om detta ämne, men jag handplockade dem som såg lite mer komplexa ut. Vissa Comparable-problem på practice-it ber dig att utöka en klass utöver att implementera Comparable – du kommer inte att behöva göra det i den här kvartalsavslutningen.
- 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
Binär Trädprogrammering (traversal)
Note: Det har fler problem, men jag handplockade några av dem som såg bra ut/verkade knepiga. Practice Finals har också några bra frågor, även om det kommer att finnas en viss överlappning med practice-it. Som sagt ovan, prioritera att arbeta med de svårare frågorna.
Lätt till medel:
- 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
Medel till svår:
- 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ädprogrammering (modifiering)
Samma som ovan – i praktiken har det fler problem, Jag valde intressanta sådana, övningsfinaler harbra frågor med viss överlappning, prioritera att arbeta med utmanande problem.
För detta ämne är det absolut nödvändigt att du har en god förståelse för x = change(x)
-mönstret. Stilguiden har några anteckningar om x = change(x)
här (oftast listar den en massa saker du inte bör göra/har några exempel) som kan vara till hjälp.
Disclaimer: Skillnaden mellan ”medium” och ”svåra” frågor blev lite suddig här för mig, så jag vet inte om de verkligen är rätt sorterade.
Lätt till medium:
- http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/removeLeaves
- http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e20%2DmakePerfect
- Detta problem ger dig en metod för ”höjd”. Du bör försöka skriva ”height”-metoden själv här: 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
Medium till svårt:
- 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 av länkade listor
Samma som ovan.
Också, om du någonsin kommer på dig själv med att tänka ”Jösses, jag önskar att jag kunde använda en extra stapel” när du arbetar med ett problem med länkade listor, är det ofta en indikation på att problemet med den länkade listan kommer att bli lättare om du försöker lösa det rekursivt.
När du löser ett problem rekursivt kan du ”lagra” variabler och information på varje nivå/på varje stapelram — detta ger dig i princip en implicit hjälpstapel.
Att ha en (implicit) stapel är dock inte nödvändigtvis användbart för alla problem med länkade listor, så försök inte tvinga in rekursion på ställen där det inte verkar naturligt.
Med detta sagt, kom ihåg att du kan ersätta kod som använder slingor med kod som använder rekursion, och vice versa, med tillräcklig ansträngning. (Frågan är om det verkligen är en bra idé att göra det…)
Lätt till medium:
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/min
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/lastIndexOf
Try do this recursively!
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/countDuplicates
Se till att utnyttja hur listan är sorterad
-
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
Medeltung till svår:
-
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
Försök göra detta både rekursivt och 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