Deadline 2.11 04:01
Viikon teemana on tasapainotetun binäärihakupuun soveltaminen, sekä puut ongelmanratkaisussa. Huomaathan, että Javan valmiita toteutuksia tietorakenteista SAA käyttää. Javassa tasapainotettua binäärihakupuuta soveltavat esim. TreeMap ja TreeSet
Uolevi on alkanut keräillä sarjakuvia ja ostaa usein uusia lehtiä kokoelmaansa. Joskus Uolevi haluaisi lukea lehden numeron, joka puuttuu hänen kokoelmastaan. Silloin hän valitsee lehden, jonka numero on mahdollisimman lähellä haluttua numeroa. Tehtäväsi on auttaa Uolevia lehden valinnassa.
Toteuta luokka Kokoelma,
joka tarjoaa seuraavat metodit:
void lisaaLehti(int numero)numero
(kokonaisluku väliltä 1..109)
int valitseLehti(int numero)numero
(kokonaisluku väliltä 1..109)
Aluksi Uolevin kokoelmassa ei ole yhtään lehteä.
Testauksessa metodeita kutsutaan
yhteensä enintään 105 kertaa.
Metodia valitseLehti ei kutsuta
ennen kuin lehtiä on ainakin yksi.
Jos vaihtoehtoja on kaksi, valitse niistä pienempi.
Seuraava koodi testaa luokkaa:
Kokoelma k = new Kokoelma(); k.lisaaLehti(3); System.out.println(k.valitseLehti(4)); System.out.println(k.valitseLehti(8)); k.lisaaLehti(9); System.out.println(k.valitseLehti(4)); System.out.println(k.valitseLehti(8));
Koodin tulostuksen tulisi olla seuraava:
3 3 3 9
Aiemmin julkaistut lehdet ovat Uolevin mielestä parhaita, minkä vuoksi hän haluaisi saada kokoelmansa täydelliseksi ainakin niiden osalta. Auta Uolevia selvittämään, mikä on pienin kokoelmasta puuttuva numero.
Toteuta luokka Kokoelma,
joka tarjoaa seuraavat metodit:
void lisaaLehti(int numero)numero
(kokonaisluku väliltä 1..109)
int pieninPuuttuva()Aluksi Uolevin kokoelmassa ei ole yhtään lehteä.
Testauksessa metodeita kutsutaan yhteensä enintään 105 kertaa.
Seuraava koodi testaa luokkaa:
Kokoelma k = new Kokoelma(); System.out.println(k.pieninPuuttuva()); k.lisaaLehti(3); System.out.println(k.pieninPuuttuva()); k.lisaaLehti(2); System.out.println(k.pieninPuuttuva()); k.lisaaLehti(1); System.out.println(k.pieninPuuttuva());
Koodin tulostuksen tulisi olla seuraava:
1 1 1 4
Toteuta metodi int evaluoi(String lauseke), joka laskee käyttäjän antaman laskutoimituksen. Laskutoimitus voi sisältää kokonaislukuja väliltä 0...1000, operaatioita + ja * sekä sulkuja. Voit olettaa, että laskutoimituksen jokainen välivaihe mahtuu int-muuttujaan.
Ohjelmasi voi olettaa, että laskutoimituksen muoto on oikea (eli ohjelman ei tarvitse sisältää virheenkäsittelyä). Laskutoimitus muodostuu merkeistä 0–9, +, *, ( ja ), eikä siinä ole ylimääräisiä välilyöntejä.
Anna laskutoimitus: 2+5*3 Tulos: 17
Anna laskutoimitus: (1+1)*5 Tulos: 10
Anna laskutoimitus: 2*(3*(5+2)+1) Tulos: 44
Anna laskutoimitus: 100*10*10 Tulos: 10000
Vihje! Yksi algoritmi tehtävän ratkaisuun tunnetaan nimellä "shunting yard". Saattaa olla kuitenkin hauskempaa keksiä itse sopiva algoritmi!
Maahan on pudonnut omenoita, ja tehtäväsi on kerätä ne koreihin. Tiedät jokaisesta omenasta, kuinka painava se on. Voit laittaa jokaiseen koriin 1 tai 2 omenaa. Lisäksi omenoiden paino korissa ei saa ylittää annettua rajaa. Kuinka monta koria tarvitset vähintään?
Esimerkiksi jos omenoiden painot ovat {1, 2, 3, 4, 5} ja korin painoraja on 5, tarvitset 3 koria: {1, 4}, {2, 3} ja {5}.
Toteuta seuraava metodi:
int korienMaara(int[] omenat, int raja)
Taulukko omenat sisältää omenoiden painot.
Omenoiden määrä on välillä 1..105
ja jokainen paino on välillä 1..109.
Parametri raja on suurin sallittu
korin omenoiden paino.
Raja on välillä 1..109, ja minkään omenan
paino ei ole tätä suurempi.
Metodin tulee palauttaa pienin mahdollinen korien määrä.
| # | metodin kutsu | haluttu palautusarvo |
|---|---|---|
| 1 | korienMaara(new int[] {1, 2, 3, 4, 5}, 5) | 3 |
| 2 | korienMaara(new int[] {2, 2, 3, 4, 5}, 5) | 4 |
| 3 | korienMaara(new int[] {1, 1, 1, 1, 1}, 5) | 3 |
| 4 | korienMaara(new int[] {3, 3, 3, 3, 3}, 5) | 5 |
| 5 | korienMaara(new int[] {5, 5, 5, 5, 5}, 5) | 5 |
Tee metodi
void ratkaise(int[][] sudoku),
joka
ratkaisee annetun sudokun. Sudoku annetaan
kaksiulotteisena
int-taulukkona.
Taulukossa 0
tarkoittaa tyhjää paikkaa ja numerot 1-9 tarkoittavat numeroita 1-9.
Metodin pitäisi muokata annettua taulukkoa niin että se on oikein
täytetty sudoku, eli:
Voit olettaa, että metodille annettuun sudokuun on olemassa yksikäsitteinen ratkaisu.
Suomalainen Arto Inkala on laatinut "maailman vaikeimman Sudokun":
Tee ohjelmastasi sellainen, että se ratkaisee kyseisen sudokun (ja muutkin löytämäsi sudokut) silmänräpäyksessä.
Vihje! Luentokalvojen kuningattaret shakkilaudalla -esimerkki.
(Tämän pitäisi ratketa hyvin nopeasti)
Anna sudoku:
8??93???2
??9????4?
7?21??96?
2??????9?
?6?????7?
?7???6??5
?27??84?6
?3????5??
5???62??8
Ratkaisu:
846937152
319625847
752184963
285713694
463859271
971246385
127598436
638471529
594362718
Anna sudoku:
??53?????
8??????2?
?7??1?5??
4????53??
?1??7???6
??32???8?
?6?5????9
??4????3?
?????97??
Ratkaisu:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
Anna sudoku:
?????????
?????3?85
??1?2????
???5?7???
??4???1??
?9???????
5??????7?
??2?1????
????4???9
Ratkaisu:
237658914
469173285
851924367
123567498
784239156
695481732
546392871
972815643
318746529