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

Como estudar

Programação, em grande parte, é sobre resolução de problemas aplicados, e não sobre memorização.Isto significa que a melhor maneira de se preparar para os exames de programação não é sentar-se e ler através destes slides — é resolvendo muitos problemas.

Como resultado, eu recomendo fortemente que você faça o seguinte ao se preparar:

  1. Tente trabalhar com um mínimo de 3 a 4 problemas de programação por dia, começando agora.

    Faltam cerca de 12 dias para o exame. Se você tiver 4 problemas por dia, você terá resolvido cerca de 30-50 problemas pelo exame, o que lhe dará uma vantagem GIGANTIC sobre as pessoas que estudaram no último minuto. Se você tem uma agenda muito ocupada, pelo menos tente fazer 1 problema por dia.

    Isso é parcialmente porque você terá muito mais experiência em resolver problemas do que as pessoas que estão em último minuto, e parcialmente porque às vezes nós apenas reutilizamos os problemas na prática – na final. Se você tiver 30-50 problemas resolvidos debaixo do cinto, as chances de encontrar afreebie no exame são muito maiores…

    Esta forma, você também terá tempo para fazer perguntas se você se deparar com problemas que o cepam.

    Tente agendar um bloco de 1 hora por dia no seu calendário onde você planeja apenas sentar-se, e trabalhar através dos problemas. (Também certifique-se de começar no HW 8 cedo, para ter certeza de que você tem muito tempo para estudar E fazer o seu HW).

  2. Atribua um dia onde você se senta, e trabalhe através de um monte de problemas de um tópico misterioso.

    Você deve tentar e praticar até o ponto em que você possa completar os problemas misteriosos de forma confiável e com 100% de precisão. Pode ser mais produtivo sentar-se apenas um dia e trabalhar de uma só vez para poder perfurar. (Por exemplo, neste fim de semana, talvez tente fazer um monte de problemas de polimorfismo)

  3. Tente e resolva os problemas de prática de uma só vez. Não “edite e recompile”.

    Na final, você não terá um compilador para checar seu trabalho. Faça o seu melhor para resolver problemas na sua primeira tentativa. Use lápis e papel para raciocinar os problemas antes de pressionar o botão “submit”.

    Se você não estiver recebendo prática de forma confiável – seus problemas estão corretos na primeira tentativa, isso significa que você precisa de muito mais prática.

    (Dito isto, para começar, concentre-se principalmente em corrigir seus problemas para começar.Uma vez que você esteja relativamente confortável com um tópico, priorize a correção dos problemas na sua primeira tentativa).

    >

  4. Mantenha uma lista de “coisas que você precisa melhorar”.

    Quando você comete um erro, negligencia algo, ou nota que você está confuso, anote-o. Use sua lista de erros para ajudar a guiá-lo em quais tipos de problemas você tem problemas e o que você precisa estudar mais.

    Por exemplo, você pode achar que às vezes você tem problemas de prática – eles podem estar errados porque você esquece de adicionar uma verificação de exceção. Isso pode indicar que na final, você deve ser extra cuidadoso ao ler as instruções.

    Or, você pode achar que você tem dificuldade com problemas de listas vinculadas onde você precisa trabalhar sobre duas listas vinculadas. Isso pode ser uma coisa boa para pedir ajuda a um TA sobre.

  5. Luta produtiva é boa; luta improdutiva é ruim.

    É normal estar lutando quando se trabalha com problemas. No entanto, tente ter uma luta “produtiva”, não uma luta “improdutiva”. Se você está trabalhando em um problema, e sente como se estivesse refazendo um progresso constante (mesmo que seja lento), então isso é luta “produtiva”.

    No entanto, se você estiver preso e tiver recorrido a mudanças aleatórias para ver se elas funcionam, isso é luta “improdutiva”. Se você atingir o estágio “improdutivo”, então você deve colocar o problema de lado, fazer uma pausa, tentar trabalhar em outro problema, tentar pedir ajuda a alguém, etc…

Problemas de coleta

Problemas de Travessia e Inserção de Árvores Binárias

Você pode encontrar alguns problemas de prática aqui: http://practiceit.cs.washington.edu/problem/search?keyword=tree+traversals

Problema 5 em todos os exames práticos também tem estes tipos de problemas.

No final, tente gastar apenas um máximo de ~5 minutos cada um nestes problemas (assim ~10 min total)com `00% de precisão.

Mistério de cobranças

Pude encontrar apenas dois problemas de mistério de cobranças envolvendo mapas na prática-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

Para este tópico, sugiro que você se certifique de entender exatamente como as seguintes estruturas de dados se comportam, quão eficientes são seus vários métodos e como eles diferem uns dos outros:

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

Mistério do polimorfismo

Pode encontrar alguns problemas de prática aqui: http://practiceit.cs.washington.edu/problem/search?keyword=polymorphism&língua=

Você deve se ocupar destes problemas na final para ter certeza de que não fará uma bobagem.

Ao trabalhar nestes problemas, certifique-se de ter uma sólida compreensão conceitual do que está acontecendo. A folha de respostas que distribuímos na seção deve ser muito útil.

Problemas de programação

Para a árvore binária e as perguntas da lista de links, eu ordenei as perguntas mais ou menos por dificuldade.

Disclaimer: Eu avaliei a dificuldade, dando uma espécie de bola de olho nos problemas. Eu posso ter perdido algumas perguntas que as tornam mais fáceis ou mais difíceis do que eu pensava originalmente.

Programação Comparável

Este problema requer que você implemente a classe inteira: http://practiceit.cs.washington.edu/problem/view/cs2/exams/finals/final8/Office

Os seguintes problemas requerem que você implemente apenas o método compareTo. Eu recomendaria que você escrevesse a classe completa de qualquer forma, já que é isso que provavelmente lhe será pedido para fazer no final.

Note: practice-it tem mais alguns problemas sobre este tópico, mas eu escolhi a dedo aqueles que pareciam mais complexos. Alguns problemas comparáveis no treino – ele pede que você estenda uma aula sem condições para implementar o Comparable — você não será obrigado a fazer isso na final deste trimestre.

  • 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

Programação de Árvore Binária (traversal)

Nota: Praticar – tem mais problemas, mas eu escolhi a dedo alguns que pareciam bons/espectáculos. As finais de treino também têm algumas boas questões, embora haja alguma sobreposição com o treino – ele. Como dito acima, priorize o trabalho com as mais difíceis.

Fácil a médio:

  • 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

Medio a duro:

  • 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

Programação de árvore binária (modificação)

O mesmo que acima — prática- tem mais problemas, Escolhi as interessantes, as finais práticas têm boas perguntas com algumas sobreposições, priorizar o trabalho em problemas desafiadores.

Para este tópico, é absolutamente essencial que você tenha uma boa compreensão do padrãox = change(x). O guia de estilo tem algumas notas sobre x = change(x) aqui (na maioria, ele lista um monte de coisas que você não deve fazer/ tem alguns exemplos) que podem ser úteis.

Disclaimer: a distinção entre questões “médias” e “difíceis” ficou um pouco desfocada aqui para mim, então idk se elas estão realmente classificadas corretamente.

Fácil para média:

  • http://practiceit.cs.washington.edu/problem/view/cs2/sections/binarytrees/removeLeaves
  • http://practiceit.cs.washington.edu/problem/view/bjp4/chapter17/e20%2DmakePerfect
    • Este problema lhe dá um método de “altura”. Você deve tentar escrever o método “altura” você mesmo aqui: 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

Medio a duro:

  • 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

Programação de lista ligada

O mesmo que acima.

>

Tambem, se alguma vez se encontrar a pensar “Gee, eu gostaria de poder usar uma pilha auxiliar” ao trabalhar num problema de lista ligada, isso é muitas vezes um indicador de que o problema da lista ligada será mais fácil se o tentar resolver recursivamente.

Ao resolver um problema recursivamente, você pode “armazenar” variáveis e informações em cada nível/em cada frame do eachstack — isto basicamente lhe dá uma pilha auxiliar implícita.

Salvar uma pilha (implícita) não será necessariamente útil para todos os problemas da lista ligada, então não tente forçar a recorrência em lugares onde ela não parece natural.

Posto isso, tenha em mente que você pode substituir código usando loops por código usando recursividade, e vice-versa, com esforço suficiente. (A questão é, é realmente uma boa idéia fazer isso…)

Fácil para o meio:

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

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

    Tente fazer isso recursivamente!

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

    Tenha certeza de explorar como a lista é classificada

  • 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

Medio a duro:

  • 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

    Tente fazer isto tanto recursivamente como iterativamente!

  • 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