TEST INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCHAPPEN - ACADEMIEJAAR 2010-2011 REEKS II Zaterdag 6 november 2010, 11u NAAM :... VRAAG 1: AFSTAND [5 PUNTEN] In deze oefening gaan we opzoek naar identieke karakters in een String. Het is de bedoeling om in een String de maximale afstand te vinden tussen twee identieke karakters. Schrijf een methode maxafstand(), met één argument van het type String. De methode geeft de maximale afstand tussen twee gelijke karakters in de String terug. Indien de String s geen identieke karakters bevat, is het resultaat -1. Afstanden worden gemeten volgens de positie van de karakters: staat een karakter op postie i en een ander op positie j, dan is hun onderlinge afstand i-j. VOORBEELDEN s maxafstand(s) "1111111" 1 "123451223334444" 8 "123454321" 8 "12345" -1 "1233231554" 6 ANTWOORD (10-TAL LIJNEN JAVA) : static int maxafstand(string s) { int m=-1; for(int i=0;i<s.length();i++) { char c=s.charat(i); int d=s.indexof(c,i+1); if((d-i)>m) m=(d-i); return m;
VRAAG 2: SPECIALE GETALLEN [5 PUNTEN] Opdat het getal g "speciaal" zou zijn, dient het aan volgende twee voorwaarden te voldoen (i) g*g moet uit dubbel zoveel cijfers bestaan dan g (ii) we splitsen g*g op in twee stukken: als n het aantal cijfers uit g voorstelt, dan noemen we x het getal dat tot stand komt door de eerste n cijfers uit g*g te beschouwen, en y idem voor de laatste n cijfers uit g*g. Opdat g "speciaal" zou zijn moet gelden dat x+y==g. Schrijf een methode isspeciaal(), met één positief geheel argument g van het type int. De methode geeft waar terug indien het getal g speciaal is, en vals in het andere geval. VOORBEELDEN g isspeciaal(g) 45 true 50 false want (i) g=45 (ii) g=50 (45)*(45) = 2025 bestaat uit 4 cijfers (het dubbel van het aantal cijfers in 45) EN x=20, y=25 -> x+y=45=g dus speciaal (50)*(50)=2500 -> x=25, y=0 -> x+y =25!= g dus NIET speciaal TIP: een getal n omzetten naar een String kan via ""+n ANTWOORD (10-TAL LIJNEN JAVA): static boolean isspeciaal(int n) { String getal=""+n; String kwadraat=""+(n*n); if(kwadraat.length()==2*getal.length()) { int d=(int)(math.pow(10, getal.length())); int x=(n*n)%d; int y=(n*n)/d; if((x+y)==n) return true; else return false; else return false;
VRAAG 3: RECURSIE : PALINDROOM[5 PUNTEN] Een palindroom is een String die identiek is aan zijn spiegelbeeld (m.a.w. van voor naar achter gelezen identiek als van achter naar voor). Voorbeelden zijn "lepel" en "meetsysteem". Schrijf een RECURSIEVE methode ispalindroom(), met één argument s van het type String. De methode geeft waar als resultaat indien s een palindroom is, en vals in het andere geval. Strings van lengte 0 (geen karakters) of 1 worden bij definitie palindromen genoemd. VOORBEELDEN s ispalindroom(s) "lepel" true "meetsysteem" true "meetapparaat" false "e" true "" true LET OP: de methode MOET recursief zijn en mag geen lusconstructies bevatten. ANTWOORD (5-TAL LIJNEN JAVA) static boolean ispalindroom(string s) { if(s.length()<2) return true; else if(s.charat(0)==s.charat(s.length()-1)) return ispalindroom(s.substring(1,s.length()-1)); else return false;
VRAAG 4 [5 PUNTEN] Let op: er wordt een giscorrectie in rekening gebracht. A. Complexiteit I [1 punt] Gegeven onderstaande methode f(). static int f(int N) { int M=3*N*N/(int)Math.log(N); int s=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) s+=(i*j)*n; return s; Hoeveel van onderstaande uitspraken zijn correct i.v.m. de complexiteit van deze methode? (i) f() is O(N 3 ) (ii) f() is O(N 2 ) (iii) f() is O(N) A. 0 B. 1 C. 2 D. 3 B De opdracht s+=(i*j)*n wordt 3N 3 /log N keer uitgevoerd. Het algoritme is dus O(N 3 /log N) en dus is enkel uitspraak (i) correct. B. Complexiteit 2 [1 punt] Volgend algoritme heeft als invoer het getal de matrix a (N rijen en N kolommen) en de rij c={c 0,..., c N-1. De notatie a ij staat voor het element van a op rij i en kolom j. De notatie c i staat voor het element op positie i uit de rij c. Het resultaat van het algoritme is het getal g, terwijl ook gebruik gemaakt wordt van de rij d (N elementen) die een tussenresultaat bevat. 1. Herhaal voor i=0 t.e.m. N-1 (in stappen van 1) 1.1 Initialiseer d i =0 2. Herhaal voor i=0 t.e.m. N-1 (in stappen van 1) 2.1 Herhaal voor j=0 t.e.m. N-1 (in stappen van 1) 2.2 Verhoog d i met a ij *c j 3. Bereken g als de som van alle elementen van d 4. Einde algoritme Hoeveel van onderstaande uitspraken omtrent de complexiteit van dit algoritme zijn correct? (i) Dit algoritme is O(N 2 ) (ii) Dit algoritme is O(N log N) (iii) Dit algoritme is O(N) A. 0 B. 1
C. 2 D. 3 B Stap 2.2 wordt N 2 keer uitgevoerd, dus is het algoritme O(N 2 ) (stappen 1 en 3 zijn beiden lineair in N). Enkel uitspraak (i) is dus correct. C. Bitoperatoren [1 punt] Wat is de waarde van k na uitvoering van onderstaand programma-fragment? A. -1 B. -2 C. -3 byte i=-13; byte j=3; byte k=(byte)((i>>j)&(-1)); D. Geen van voorgaande alternatieven is correct. Bitpatroon van -13 luidt: 11110011 B 3 posities naar rechts schuiven (met inschuiven van tekenbit) levert : 11111110 Hetgeen -2 voorstelt. D. Lussen [1 punt] Wat is de waarde van t na uitvoering van onderstaand programma-fragment? A. 1 B. 3 C. 5 int a=10,b=0,n=3,t=0; do { a--; n+=2; b++; t++; while(!(a<n) (b<5)); D. Geen van de voorgaande alternatieven is correct. C
E. Oproepen van methoden [1 punt] Gegeven onderstaande methode f(). static int f(int t,string s) { for(int i=0;i<s.length();i++) t+=(int)(s.charat(i))-(int)'0'; return t; Wat is de waarde van t na uitvoering van onderstaand programma-fragment? A. 20 B. 26 C. 46 int t=20; t+=f(t,"123"); D. Geen van de voorgaande alternatieven is correct. C