Løsningsforslag - oppgaver i Avsnitt 1.1.5


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