Løsningsforslag - oppgaver i Avsnitt 1.2.5


Oppgave 2

  public static int[] nestMaks(int[] a)
  {
    int n = a.length;  // tabellens lengde

    // må ha minst to verdier i tabellen
    if (a.length < 2) throw new
      IllegalArgumentException("a.length(" + a.length + ") < 2!");

    int sist = a.length - 1; // siste posisjon i tabellen

    // starter med å se på første og siste verdi i tabellen
    int m = 0; // første posisjon
    int nm = sist; // siste posisjon

    // m skal være sist hvis a[sist] er større enn a[0]
    if (a[sist] > a[0]) { m = sist; nm = 0; }

    int maksverdi = a[m];  // største verdi
    int nestmaksverdi = a[nm];  // nest største verdi

    int temp = a[sist];            // tar vare på siste verdi
    a[sist] = 0x7fffffff;          // legger tallet 2147483647 sist

    for (int i = 1; ; i++)
    {
      if (a[i] >= nestmaksverdi)
      {
        if (i == sist)
        {
          a[sist] = temp; int[] b = {m,nm}; return b;
        }
        else if (a[i] > maksverdi)
        {
          nm = m; nestmaksverdi = maksverdi;
          m = i; maksverdi = a[m];
        }
        else
        {
          nm = i;
          nestmaksverdi = a[nm]; // ny nest størst
        }
      }
    } // for
  } // nestMaks

Oppgave 3

  public static int[] nestMin(int[] a)
  {
    int n = a.length;   // tabellens lengde

    if (n < 2) throw new IllegalArgumentException
                             ("a.length(" + n + ") < 2!");

    int m = Tabell.min(a);   // m er posisjonen til tabellens minste verdi

    int nm = 0;   // nm står for nestmin

    if (m == 0) nm = Tabell.min(a,1,n);              // leter i a[1:n>
    else if (m == n-1) nm = Tabell.min(a,0,n-1);     // leter i a[0:n-1>
    else
    {
      int mv = Tabell.min(a,0,m);                   // leter i a[0:m>
      int mh = Tabell.min(a,m+1,n);                 // leter i a[m+1:n>
      nm = a[mh] < a[mv] ? mh : mv;           // hvem er minst?
    }

    int[] b = {m,nm};
    return b;  // minste verdi i b[0], nest minste i b[1]

  } // nestMin

Oppgave 4

Ikke laget

  public static int[] tredjeMaks(int[] a)
  {
    int n = a.length;     // tabellens lengde

    if (n < 3)     // må ha minst tre verdier
    {
      throw new IllegalArgumentException("a.length(" + n + ") < 3!");
    }

    int m = 0;     // m er posisjonen til størst verdi
    int nm = 1;    // nm er posisjonen til nest størst verdi
    int tm = 2;    // tm er posisjonen til tredje størst verdi

    // vi bytter om slik at når vi starter er m posisjonen til
    // den største av de tre første, nm er posisjonen til den nest
    // største og tm posisjonen til den minste av de tre første

    if (a[nm] > a[m])
    {
      m = 1;
      nm = 0;
    }

    if (a[tm] > a[m])
    {
      int temp = tm;
      tm = m;
      m = temp;
    }

    if (a[tm] > a[nm])
    {
      int temp = tm;
      tm = nm;
      nm = temp;
    }

    int maksverdi = a[m];                // største verdi
    int nestmaksverdi = a[nm];           // nest største verdi
    int tredjemaksverdi = a[tm];         // tredje største verdi

    for (int i = 3; i < n; i++)
    {
      int verdi = a[i];

      if (verdi > tredjemaksverdi)
      {
        if (verdi > nestmaksverdi)
        {
          if (verdi > maksverdi)
          {
            tm = nm;
            tredjemaksverdi = nestmaksverdi;

            nm = m;
            nestmaksverdi = maksverdi;

            m = i;
            maksverdi = verdi;
          }
          else  // verdi <= maksverdi && verdi > nestmaksverdi
          {
            tm = nm;
            tredjemaksverdi = nestmaksverdi;

            nm = i;
            nestmaksverdi = verdi;
          }
        }
        else // verdi <= nestmaksverdi && verdi > tredjemaksverdi
        {
          tm = i;
          tredjemaksverdi = verdi;
        }
      }

    } // for

    return new int[] { m, nm, tm };
  }