Oppgave 1
Hvis det Programkode 1.1.5 brukes på en tabell a med ingen elementer
(dvs. a.length lik 0), finnes det ikke noe element med indeks lik 0. Dermed vil setningen
int maksverdi = a[0]
gi en ArrayIndexOutOfBoundsException
.
Hvis tabellen a har kun ett element, vil for-løkken gå én gang siden sist er 0. Dermed returneres 0 som er posisjonen til den største. Hvis det er kun ett element, er det også størst.
Oppgave 2
Alternativ 1.
Hvis a[i] ≥ maksverdi
er sann, oppdaterer vi maksverdi kun hvis
a[i] > maksverdi
:
public static int maks(int[] a) // versjon 3 av maks-metoden { int sist = a.length - 1; // siste posisjon i tabellen int m = 0; // indeks til største verdi int maksverdi = a[0]; // største verdi int temp = a[sist]; // tar vare på siste verdi a[sist] = 0x7fffffff; // legger tallet 2147483647 sist for (int i = 0; ; i++) // i starter med 1 if (a[i] >= maksverdi) // denne blir sann til slutt { if (i == sist) // sjekker om vi er ferdige { a[sist] = temp; // legger siste verdi tilbake return temp > maksverdi ? sist : m; // er siste størst? } else if (a[i] > maksverdi) { maksverdi = a[i]; // maksverdi oppdateres m = i; // m oppdateres } } } // maks
Alternativ 2.
Vi kan bruke samme idé som i Programkode 1.1.5, men gjennomføre letingen fra høyre mot venstre. Hvis maks-verdien forekommer flere ganger blir det dermed posisjonen til den av dem som ligger lengst til venstre, som returneres:
public static int maks(int[] a) { int m = a.length - 1; // indeks til største verdi int maksverdi = a[m]; // største verdi int temp = a[0]; // tar vare på første verdi a[0] = 0x7fffffff; // legger tallet 2147483647 først for (int i = m; ; i--) // i starter bakerst if (a[i] >= maksverdi) // denne blir sann for i = 0 { if (i == 0) // sjekker om vi er ferdige { a[0] = temp; // legger siste verdi tilbake return temp >= maksverdi ? 0 : m; // er første størst? } else { maksverdi = a[i]; // maksverdi oppdateres m = i; // m oppdateres } } } // maks
Oppgave 3
public static int maks(int[] a) { int sist = a.length - 1; // siste posisjon i tabellen int m = 0; // indeks til største verdi int maksverdi = a[0]; // største verdi int temp = a[sist]; // tar vare på siste verdi a[sist] = maksverdi; // maksverdi legges sist for (int i = 0; ; i++) // i starter med 1 if (a[i] >= maksverdi) // denne blir sann til slutt { if (i == sist) // sjekker om vi er ferdige { a[sist] = temp; // legger siste verdi tilbake return a[sist] > maksverdi ? sist : m; // er siste størst? } else if (a[i] > maksverdi) { maksverdi = a[i]; // maksverdi oppdateres a[sist] = maksverdi; // maksverdi legges sist m = i; // m oppdateres } } } // maks