Avatar billede Slettet bruger
28. april 2008 - 20:32 Der er 11 kommentarer og
1 løsning

Finde første tal der IKKE optræder i List?

Hejsa!

Findes der en let fremgangsmåde eller måske funktion til at finde første tal i en List (f.eks. List<int>) eller Array der IKKE er nævnt (måske fra et bestemt sted på tallinjen)?

Eks.:
0 2 1 22 6 924 7
Hvis man ledte fra 6 ovenfor, skulle 8 findes, da det er det første tal, der ikke findes efter 6.
Avatar billede arne_v Ekspert
28. april 2008 - 20:54 #1
Umiddelbart ville der nemmeste nok vaere at sortere foerst !
Avatar billede arne_v Ekspert
28. april 2008 - 20:58 #2
Noget hurtigt bixet kode:

using System;
using System.Collections.Generic;

namespace E1
{
    public class Program
    {
        public static int FindLowestMissingVal(List<int> lst, int startval)
        {
            List<int> slst = new List<int>(lst);
            slst.Sort();
            int ix = 0;
            while(slst[ix] != startval) ix++;
            while(slst[ix+1] == slst[ix] + 1) ix++;
            return slst[ix]+1;
        }
        public static void Main(string[] args)
        {
            List<int> lst = new List<int>(new int[] { 0, 2, 1, 22, 6, 924, 7 });
            Console.WriteLine(FindLowestMissingVal(lst, 6));
            Console.WriteLine(FindLowestMissingVal(lst, 0));
            Console.ReadKey();
        }
    }
}
Avatar billede Slettet bruger
28. april 2008 - 21:00 #3
Hmm, ok. Så kan jeg nu også selv finde frem til en løsning :o) Tænkte bare, at der måske var en entydigt lettest metode. Roder lige med det.
Avatar billede Slettet bruger
28. april 2008 - 21:01 #4
Haha, to minutters postinterval :P Det er sgu timet.
Avatar billede Slettet bruger
28. april 2008 - 21:33 #5
Hmm...

private static int FindNextInteger(List<int> integers, int start)
{
  integers.Sort();
  if (integers[0] > start)
    return start;
  for (int i = 0; i < integers.Count - 1; i++)
  {
    if (integers[i + 1] - integers[i] > 1)
      return integers[i] + 1;
  }
}

Burde det ikke være den mindst processorkrævende funktion?
Avatar billede Slettet bruger
28. april 2008 - 21:37 #6
Hov,

return integers[integers.Count - 1];

i slutningen af funktionen :)
Avatar billede Slettet bruger
28. april 2008 - 21:41 #7
Whoops,

        private static int FindNextInteger(List<int> integers, int start)
        {
            integers.Sort();
            if (integers[0] > start)
                return start;
            for (int i = 0; i < integers.Count - 1; i++)
            {
                if (integers[i] > start && integers[i + 1] - integers[i] > 1)
                    return integers[i] + 1;
            }
            return integers[integers.Count - 1] + 1;
        }

Man er vel naab!
Avatar billede arne_v Ekspert
28. april 2008 - 21:45 #8
Der er 2 forskelle i forhold til min:
* jeg sorterer paa en kopi saaledes at den ikke aendrer originalen
* jeg tror at din for loekke mangler et eller andet med start
Avatar billede arne_v Ekspert
28. april 2008 - 21:55 #9
OK.

Saa begynder det jo at ligne noget.

Muligvis er den for loekke mnarginalt hurtigere end while loekkerne.

Men sorteringen er den dyre operation.
Avatar billede Slettet bruger
28. april 2008 - 22:04 #10
Ja... Hm. Jeg er både naab og idealist, som du måske har regnet ud.
Anyway, kan du spotte fejlen i den sidste kode, jeg sendte? Skriver lige tilbage om lidt (kender selv fejlern).
Avatar billede Slettet bruger
28. april 2008 - 22:16 #11
Nå. Her kommer det: Den kunne ikke håndtere tomme Lists.
Løsning:

        private static int FindNextInteger(List<int> integers)
        {
            return FindNextInteger(integers, 0);
        }

        private static int FindNextInteger(List<int> integers, int start)
        {
            if (integers.Count == 0)
                return -1;
            integers.Sort();
            if (integers[0] > start)
                return start;
            for (int i = 0; i < integers.Count - 1; i++)
            {
                if (integers[i] > start && integers[i + 1] - integers[i] > 1)
                    return integers[i] + 1;
            }
            return integers[integers.Count - 1] + 1;
        }

        private static int FindNextNoteId()
        {
            if (Notes.Count == 0)
                return 0;
            List<int> ids = new List<int>();
            for (int i = 0; i < Notes.Count; i++)
                ids.Add(GetNoteId(Notes[i]));
            return FindNextInteger(ids);
        }

Nu kan du vist godt smide et svar :)
Avatar billede arne_v Ekspert
29. april 2008 - 01:07 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester