Michael0x2a/cse-143-16au-study-guide.md
Jak się uczyć
Programowanie, w dużym stopniu, polega na rozwiązywaniu problemów, a nie na zapamiętywaniu. Oznacza to, że najlepszym sposobem na przygotowanie się do egzaminów z programowania nie jest siedzenie i czytanie slajdów, ale rozwiązywanie wielu problemów.
W związku z tym, zdecydowanie zalecam następujące czynności podczas przygotowań:
-
Postaraj się rozwiązywać minimum 3 do 4 problemów programistycznych dziennie, zaczynając od teraz.
Do egzaminu pozostało około 12 dni. Jeśli będziesz rozwiązywał 4 problemy dziennie, to do egzaminu będziesz miał rozwiązane około 30-50 problemów, co da ci GIGANTYCZNĄ przewagę nad ludźmi, którzy uczą się w ostatniej chwili. Jeśli masz bardzo napięty harmonogram, przynajmniej spróbuj zrobić 1 problem dziennie.
Jest to częściowo dlatego, że będziesz miał dużo więcej doświadczenia w rozwiązywaniu problemów wtedy ludzie whodo last-minute cramming, a częściowo dlatego, że czasami po prostu ponowne wykorzystanie problemów na practice-iton ostateczne. Jeśli masz 30-50 rozwiązanych problemów pod swoim paskiem, szanse napotkania afreebie na egzaminie są znacznie wyższe…
W ten sposób, będziesz miał również czas na zadawanie pytań, jeśli napotkasz problemy, które cię zatykają.
Spróbuj zaplanować 1 godzinny blok każdego dnia w swoim kalendarzu, gdzie planujesz po prostu usiąść i pracować nad problemami. (Również upewnij się, aby rozpocząć na HW 8 wcześnie, aby upewnić się, że masz mnóstwo czasu, aby zarówno studiować I zrobić swoje HW).
-
Przydziel dzień, w którym usiądziesz, i pracować przez kilka problemów z tajemniczego tematu.
Powinieneś spróbować i ćwiczyć do punktu, w którym można zakończyć tajemnicze problemy niezawodnie i ze 100% dokładnością. To może być bardziej produktywne, aby po prostu usiąść jeden dzień, i pracować przez kilka na raz, więc można ćwiczyć. (Na przykład, w ten weekend, może spróbuj zrobić kilka problemów z polimorfizmem)
-
Postaraj się rozwiązać problemy practice-it w jednym strzale. Nie „edytuj i rekompiluj”.
Na finale, nie będziesz miał kompilatora do sprawdzenia swojej pracy. Zrób co w twojej mocy, aby rozwiązać problemy za pierwszym podejściem. Używaj ołówka i papieru do rozwiązywania problemów zanim wciśniesz przycisk „wyślij”.
Jeśli nie jesteś niezawodny w rozwiązywaniu problemów przy pierwszej próbie, oznacza to, że potrzebujesz dużo więcej praktyki.
(To powiedziawszy, na początek, skup się głównie na rozwiązywaniu problemów na początku.Kiedy już jesteś względnie wygodny w temacie, nadaj priorytet rozwiązywaniu problemów przy pierwszej próbie).
-
Prowadź bieżącą listę „rzeczy, które musisz poprawić”.
Kiedy popełnisz błąd, przeoczysz coś, lub zauważysz, że jesteś zdezorientowany, zapisz to.Użyj swojej bieżącej listy błędów, aby pomóc ci w prowadzeniu cię po tym, z jakimi typami problemów masz problemy i co musisz studiować więcej.
Na przykład, możesz odkryć, że czasami dostajesz practice-it problemy źle, ponieważ zapomniałeś dodać sprawdzenie wyjątku. To może wskazywać, że w finale, powinieneś być bardzo ostrożny w czytaniu instrukcji.
Albo, może się okazać, że masz trudności z problemami z listami połączonymi, gdzie trzeba pracować nad dwoma listami połączonymi. To może być dobra rzecz, aby poprosić TA o pomoc.
-
Produktywna walka jest dobra; bezproduktywna walka jest zła.
To normalne, że zmagasz się z problemami podczas pracy nad nimi. Jednakże, staraj się mieć „produktywne” zmagania, a nie „bezproduktywne”. Jeśli pracujesz nad problemem i czujesz, że robisz stałe postępy (nawet jeśli są one powolne), to jest to „produktywna” walka.
Jednakże, jeśli utknąłeś i uciekłeś się do wprowadzania przypadkowych zmian, aby zobaczyć, czy działają, to jest to „bezproduktywna” walka. Jeśli trafisz na etap „bezproduktywny”, wtedy powinieneś odłożyć problem na bok, zrobić sobie przerwę, spróbować popracować nad innym problemem, spróbować poprosić kogoś o pomoc, itp…
Problemy z kolekcją
Problemy z odwracaniem i wstawianiem drzew binarnych
Możesz znaleźć tutaj kilka problemów praktycznych: http://practiceit.cs.washington.edu/problem/search?keyword=tree+traversals
Problem 5 na wszystkich egzaminach praktycznych również ma te typy problemów.
Na finale, spróbuj spędzić tylko max ~5 minut każdy na tych problemach (więc ~10 min total)z `00% dokładnością.
Zagadka zbiorów
Na practice-it udało mi się znaleźć tylko dwa problemy zagadki zbiorów z udziałem map:
- http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/collectionMystery
- http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final7/collectionMystery
Dla tego tematu sugeruję upewnić się, że rozumiesz jak dokładnie zachowują się następujące struktury danych, jak wydajne są ich różne metody i jak się od siebie różnią:
- ArrayList
- LinkedList
- Stack
- Queue
- TreeSet
- HashSet
- TreeMap
- HashMap
.
Zagadka polimorfizmu
Możesz znaleźć kilka problemów praktycznych tutaj: http://practiceit.cs.washington.edu/problem/search?keyword=polymorphism&language=
Powinieneś poświęcić swój czas na te problemy na finale, aby upewnić się, że nie popełnisz głupiego błędu.
Pracując nad tymi problemami, upewnij się, że masz solidne koncepcyjne zrozumienie tego, co się dzieje. Cheatsheet, który rozdaliśmy na sekcji powinien być bardzo przydatny.
Problemy programistyczne
Dla pytań dotyczących drzew binarnych i list połączonych, posegregowałem pytania z grubsza według trudności.Zdecydowanie zalecam, abyś najpierw rozwiązał pytania od średnich do trudnych, a dopiero potem spróbował rozwiązać pytania od łatwych do trudnych, jeśli masz trudności z tymi trudniejszymi.
Zastrzeżenie: Oceniłem trudność przez coś w rodzaju „eye-balling” problemów. I might have missednuances to certain questions that make them easier or harder then I originally thought.
Comparable Programming
This problem requires you to implement the entire class: http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/Office
Poniższe problemy wymagają od Ciebie zaimplementowania tylko metody compareTo. Zalecam napisanie kompletnej klasy tak czy inaczej, ponieważ to jest to, o co prawdopodobnie zostaniesz poproszony w finale.
Uwaga: practice-it ma trochę więcej problemów na ten temat, ale wybrałem te, które wyglądały na nieco bardziej złożone. Niektóre problemy z Comparable na practice-it proszą Cię o rozszerzenie klasy oprócz implementacji Comparable — nie będziesz musiał tego robić na finale w tym kwartale.
- 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
Programowanie drzew binarnych (traversal)
Uwaga: practice-it ma więcej problemów, ale ręcznie wybrałem kilka, które wyglądały dobrze/seemedtricky. Finały praktyki również mają kilka dobrych pytań, choć nie będzie trochę overlapwith praktyki-it. Jak stwierdzono powyżej, priorytetem jest praca nad tymi trudniejszymi.
Łatwe do średnich:
- 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
Średnie do trudnych:
- 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
Programowanie drzew binarnych (modyfikacja)
Tak jak wyżej — praktyka – ma więcej problemów, Wybrałem interesujące, ćwicz finały z dobrymi pytaniami, które trochę się pokrywają, ustaw priorytety w pracy nad trudnymi problemami.
Dla tego tematu, jest absolutnie niezbędne, abyś miał dobre zrozumienie wzorcax = change(x)
. Przewodnik stylu ma kilka uwag na temat x = change(x)
tutaj (głównie, wymienia kilka rzeczy, których nie powinieneś robić / ma kilka przykładów), które mogą być pomocne.
Zastrzeżenie: rozróżnienie między „średnimi” i „trudnymi” pytaniami jest dla mnie trochę niewyraźne, więc nie wiem, czy są one naprawdę poprawnie posortowane.
Łatwe do średnich:
- http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/removeLeaves
- http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e20%2DmakePerfect
- Ten problem daje ci metodę „height”. Powinieneś spróbować napisać metodę „wysokość” tutaj: 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
Średnie do trudnych:
- 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
Programowanie list połączonych
Tak jak wyżej.
Aso, if you ever find yourself thinking „Gee, I wish I could use an auxilliary stack” when workingon a linked list problem, that’s often an indicator that the linked plist problem will be easierif you tried solving it recursively.
Przy rekurencyjnym rozwiązywaniu problemu możesz „przechowywać” zmienne i informacje na każdym poziomie/na każdej ramce stosu — to w zasadzie daje ci niejawny stos pomocniczy.
Posiadanie (niejawnego) stosu niekoniecznie będzie użyteczne dla wszystkich problemów związanych z listą połączoną, więc nie próbuj wymuszać rekurencji w miejscach, gdzie nie wydaje się to naturalne.
To powiedziawszy, pamiętaj, że możesz zastąpić kod używający pętli kodem używającym rekurencji, i vice versa, przy wystarczającym wysiłku. (Pytanie tylko, czy to rzeczywiście dobry pomysł…)
Łatwe do średnich:
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/min
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/lastIndexOf
Spróbuj zrobić to rekurencyjnie!
-
http://practiceit.cs.washington.edu/problem/view/cs2/sections/linkedlists/countDuplicates
Upewnij się, że wykorzystujesz sposób sortowania listy
-
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
Średnio trudny do trudnego:
-
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
Spróbuj zrobić to zarówno rekurencyjnie, jak i iteracyjnie!
-
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