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ń:

  1. 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).

  2. 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)

  3. 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).

  4. 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.

  5. 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