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

Miten opiskella

Ohjelmoinnissa on pitkälti kyse soveltavasta ongelmanratkaisusta, ei ulkoa opettelusta.Paras tapa valmistautua ohjelmointitutkintoon ei siis ole istua alas ja lukea läpi dioja, vaan ratkaista paljon ongelmia.

Sen vuoksi suosittelen vahvasti seuraavaa valmistautumista:

  1. Yritä käydä läpi vähintään 3-4 ohjelmointiongelmaa päivässä, alkaen tästä hetkestä.

    Tenttiin on jäljellä noin 12 päivää. Jos teet 4 ongelmaa päivässä, olet ratkaissut noin 30-50 ongelmaa tenttiin mennessä, mikä antaa sinulle jättimäisen edun verrattuna ihmisiin, jotka opiskelevat viime hetkellä.

    Tämä johtuu osittain siitä, että sinulla on paljon enemmän kokemusta ongelmien ratkaisemisesta kuin ihmisillä, jotka tekevät viime hetken opettelua, ja osittain siitä, että joskus käytämme ongelmia uudelleen harjoituksissa loppukokeessa. Jos sinulla on 30-50 ratkaistua ongelmaa, on todennäköisyys, että tentissä tulee vastaan freebie-ongelma, paljon suurempi…

    Tällöin sinulla on myös aikaa kysyä kysymyksiä, jos törmäät ongelmiin, jotka askarruttavat sinua.

    Kokeile varata kalenteriisi joka päivä yksi tunti aikaa, jonka aikana aiot vain istua alas ja työstää ongelmia. (Varmista myös, että aloitat HW 8:n tekemisen ajoissa, jotta sinulla on riittävästi aikaa sekä opiskella että tehdä HW:t.)

  2. Varaa päivä, jolloin istut alas ja työstät läpi joukon ongelmia jostain mysteeri-aiheesta.

    Yritä harjoitella niin pitkälle, että pystyt ratkaisemaan mysteeri-ongelmat luotettavasti ja 100-prosenttisella tarkkuudella. Saattaa olla tuottavampaa vain istua alas yhtenä päivänä ja käydä läpi kasa kerralla, jotta voit harjoitella. (Esimerkiksi tänä viikonloppuna voit ehkä yrittää tehdä joukon polymorfismiongelmia)

  3. Yritä ratkaista harjoitus-it-ongelmat kerralla. Älä ”muokkaa ja käännä uudelleen”.

    Finaalissa sinulla ei ole kääntäjää tarkistamassa työtäsi. Tee parhaasi ratkaistaksesi ongelmat ensimmäisellä yrittämällä. Käytä kynää ja paperia ongelmien pohtimiseen ennen kuin painat ”lähetä”-painiketta.

    Jos et saa luotettavasti harjoitus-it-ongelmia oikein ensimmäisellä yritykselläsi, se tarkoittaa, että tarvitset paljon enemmän harjoittelua.

    (Tämän sanottuasi keskity aluksi pääasiassa siihen, että saat ongelmasi oikein.Kun olet suhteellisen tyytyväinen aiheeseen, aseta etusijalle ongelmien saaminen oikein ensimmäisellä yritykselläsi).

  4. Pitäkää juoksevaa listaa ”asioista, joita sinun pitää parantaa”.

    Kun teet virheen, unohdat jotain tai huomaat olevasi hämmentynyt, kirjoita se ylös.Käytä juoksevaa virheiden listaa apuna opastaaksesi sinua siinä, minkä tyyppisten ongelmien kanssa sinulla on vaikeuksia ja mitä sinun pitää opiskella lisää.

    Voit esimerkiksi huomata, että saat joskus harjoitus-sit-ongelmia väärin, koska unohdat lisätä poikkeustarkastuksen. Tämä saattaa viitata siihen, että loppukokeessa sinun pitäisi olla erityisen huolellinen ohjeiden lukemisessa.

    Tai saatat huomata, että sinulla on vaikeuksia linkitettyjen listojen ongelmissa, joissa sinun täytyy käsitellä kahta linkitettyä listaa. Siinä voisi olla hyvä pyytää apua opinto-ohjaajalta.

  5. Tuottava kamppailu on hyvä asia, tuottamaton kamppailu on huono asia.

    On normaalia, että kamppailet ongelmien parissa. Pyri kuitenkin ”tuottavaan ”kamppailuun, älä ”tuottamattomaan” kamppailuun. Jos työskentelet jonkin ongelman parissa ja tuntuu, että edistyt tasaisesti (vaikka hitaasti), se on ”tuottavaa” kamppailua.

    Jos kuitenkin olet jumissa ja olet turvautunut satunnaisten muutosten tekemiseen nähdäkseni, toimivatko ne, se on ”tuottamatonta” kamppailua. Jos olet saavuttanut ”tuottamattoman” vaiheen, sinun pitäisi siirtää ongelma syrjään, pitää tauko, yrittää työskennellä toisen ongelman parissa, yrittää pyytää apua joltakulta jne…

Kokoelmaongelmia

Binääripuiden läpikäynti- ja lisäysongelmia

Täältä löydät harjoitusongelmia: http://practiceit.cs.washington.edu/problem/search?keyword=tree+traversals

Kaikissa harjoituskokeissa oleva ongelma 5 sisältää myös näitä ongelmatyyppejä.

Yritä käyttää loppukokeessa vain max ~5 minuuttia kuhunkin näistä ongelmista (eli yhteensä ~10 min)`00% tarkkuudella.

Kokoelmien mysteeri

Pystyin löytämään vain kaksi karttoja sisältävää kokoelmien mysteeri -ongelmaa 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

Tämän aiheen kohdalla suosittelen, että varmistat, että ymmärrät tarkalleen, miten tarkalleen ottaen seuraavat tietorakenteetkäyttäytyvät, kuinka tehokkaita niiden eri metodit ovat, ja miten ne eroavat toisistaan:

  • ArrayList
  • LinkedList
  • Stack
  • Queue
  • TreeSet
  • HashSet
  • TreeMap
  • HashMap

Polymorfismin mysteeri

Täältä löydät harjoitustehtäviä: http://practiceit.cs.washington.edu/problem/search?keyword=polymorphism&kieli=

Sinun kannattaa käyttää aikaa näiden ongelmien käsittelyyn loppukokeessa, jotta et tee typerää virhettä.

Työskennellessäsi näiden ongelmien parissa varmista, että sinulla on vankka käsitteellinen ymmärrys siitä, mistä on kyse. Jaksolla jakamastamme huijauslomakkeesta pitäisi olla paljon hyötyä.

Ohjelmointiongelmat

Binääripuu- ja linkitettyjen listojen kysymysten osalta olen lajitellut kysymykset karkeasti vaikeusasteen mukaan.Suosittelen vahvasti, että priorisoit ensin keskivaikeiden ja vaikeiden kysymysten ratkaisemisen ja kokeilet helppoja ja vaikeita kysymyksiä vain, jos sinulla on vaikeuksia vaikeampien kysymysten ratkaisemisessa.

Vastuuvapautuslauseke: Arvioin vaikeusastetta ikään kuin silmäilemällä ongelmia. Minulta on saattanut jäädä huomaamatta joidenkin kysymysten kohdalla poikkeuksia, jotka tekevät niistä helpompia tai vaikeampia kuin alun perin ajattelin.

Vertailukelpoinen ohjelmointi

Tässä tehtävässä sinun on toteutettava koko luokka: http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/Office

Seuraavat ongelmat vaativat sinua toteuttamaan vain compareTo-metodin. Suosittelen, että yrität joka tapauksessa kirjoittaa koko luokan, koska sitä sinua todennäköisesti pyydetään tekemään finaalissa.

Huomautus: Practice-it:ssä on muutama muukin ongelma tästä aiheesta, mutta valitsin käsin sellaisia, jotka näyttivät hieman monimutkaisemmilta. Joissakin Practice-it:n Comparable-ongelmissa pyydetään sinua laajentamaan luokkaa sen lisäksi, että toteutat Comparablea – sinun ei tarvitse tehdä sitä tämän vuosineljänneksen loppukokeessa. Käytännössä siinä on useampia ongelmia, mutta valitsin käsin muutamia, jotka näyttivät hyviltä/vaikuttivat hankalilta. Harjoitusfinaalissa on myös joitakin hyviä kysymyksiä, vaikka niissä on jonkin verran päällekkäisyyttä practice-it:n kanssa. Kuten edellä todettiin, priorisoi vaikeimpien kysymysten työstäminen.

Leppoisesta keskivaikeaan:

  • 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

Keskivaikeasta vaikeaan:

  • 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ääripuiden ohjelmointi (modifikaatio)

Samoin kuin edellä — käytännössä siinä on enemmän ongelmia, Valitsin mielenkiintoisia, harjoitusfinaaleissa onhyviä kysymyksiä, joissa on jonkin verran päällekkäisyyttä, priorisoi haastavien ongelmien työstäminen.

Tässä aiheessa on ehdottoman tärkeää, että sinulla on hyvä ymmärrysx = change(x)-kuviosta. Tyylioppaassa on joitain huomautuksia x = change(x):stä (enimmäkseen siinä luetellaan joukko asioita, joita sinun ei pitäisi tehdä/on joitain esimerkkejä), jotka voivat olla hyödyllisiä.

Disclaimer: ero ”keskivaikeiden” ja ”vaikeiden” kysymysten välillä hämärtyi tässä itselleni,joten idk jos ne on oikeasti lajiteltu oikein.

Ehelppo keskivaikea:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/removeLeaves
  • http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e20%2DmakePerfect
    • Tämässä tehtävässä saat ”korkeus”-menetelmän. Sinun kannattaa kokeilla kirjoittaa ”height”-metodi itse tähän: 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

Keskivaikeasta vaikeaan:

  • 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

Linkitettyjen listojen ohjelmointi

Samoin kuin edellä.

Myös, jos huomaat joskus ajattelevasi ”Jukra, kunpa voisin käyttää apupinoa” työskennellessäsi linkitetyn listan ongelmaa, se on usein merkki siitä, että linkitetyn listan ongelma olisi helpompi, jos yrittäisit ratkaista sen rekursiivisesti.

Kun ratkaiset ongelmaa rekursiivisesti, voit ”varastoida” muuttujia ja tietoa jokaiselle tasolle/jokaiselle pino-kehykselle — tämä periaatteessa antaa sinulle implisiittisen apupinon.

(Implisiittinen) pino ei kuitenkaan välttämättä ole hyödyllinen kaikissa linkitettyjen listojen ongelmissa, joten älä yritä pakottaa rekursiota paikkoihin, joissa se ei tunnu luonnolliselta.

Tämän sanottuasi pidä mielessä, että voit korvata silmukoita käyttävän koodin rekursiota käyttävällä koodilla ja päinvastoin riittävällä vaivalla. (Kysymys kuuluukin, onko se oikeasti hyvä idea tehdä niin…)

Leppoisesta keskinkertaiseen:

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

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

    Kokeile tehdä tämä rekursiivisesti!

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

    Varmista, että hyödynnät sitä, miten lista on lajiteltu

  • 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

Keskivaikea vaikeaan:

  • 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

    Kokeile tehdä tämä sekä rekursiivisesti että iteratiivisesti!

  • 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