20. august 2010 - 22:13Der er
5 kommentarer og 1 løsning
Rekursiv metode til fortløbende tal
Det kan være det er fordi jeg har kigget på det for længe eller fordi det er fredag aften; men jeg kan ikke vikle min hjerne omkring denne her lige nu :)
Jeg skal bruge en metode, der kan tage imod en række tal (i en liste eller array) samt et enkelt tal, der indikerer det antal fortløbende tal, der skal tjekkes for i listen - og den skal desuden returnere de tal, der matcher forespørgslen.
Altså - hvis jeg giver metoden følgende data:
List<int> tal = new List<int>() {1, 2, 6, 7, 8, 10}; int antalFort = 2;
Så vil jeg gerne tjekke "tal" for de sammensætninger, der har 2 (antalFort) fortløbende tal og så returnere den komplette liste:
1 -> 2 er fortløbende - tilføj 1 til listen 2 -> 6 er ikke fortløbende - ignorer 6 -> 7 er fortløbende - tilføj 6 til listen 7 -> 8 er fortløbende - tilføj 7 til listen 8 -> 10 er ikke fortløbende - ignorer
Dette skal give mig en liste (eller array) tilbage med (1, 6, 7).
Ændres værdierne til f.eks.:
List<int> tal = new List<int>() {4, 5, 6, 7, 8, 10, 11, 12, 19, 20}; int antalFort = 3;
så skal følgende ske:
4 -> 5 -> 6 er fortløbende - tilføj 4 til listen 5 -> 6 -> 7 er fortløbende - tilføj 5 til listen 6 -> 7 -> 8 er fortløbende - tilføj 6 til listen 7 -> 8 -> 10 er ikke fortløbende - ignorer 8 -> 10 -> 11 er ikke fortløbende - ignorer 10 -> 11 -> 12 er fortløbende - tilføj 10 til listen 11 -> 12 -> 19 er ikke fortløbende - ignorer 12 -> 19 -> 20 er ikke fortløbende - ignorer 19 -> 20 kan ikke danne 3 fortløbende tal - ignorer 20 kan ikke danne 3 fortløbende tal - ignorer
Med disse værdier skulle jeg gerne ende ud med en liste med (4, 5, 6, 10).
Logisk set burde en rekursiv metode til dette være relativt simpel, men min hjerne vil slet ikke vikle sig omkring den lige nu - er der nogen, der kan hjælpe? :)
Måske arne_v kommer på banen med en super elegant løsning :-)
mvh
private static List<string> GetFort(List<int> list, int antalFort) { List<string> containsList = new List<string>(); foreach (int i in list) { var conList = new List<int>() { i };
bool contains = true; for (int x = 1; x < antalFort; x++) { int item = i + x; contains = list.Contains(item); if (!contains) break; conList.Add(item); }
Jeg var ikke sikker på at dine tal kom i rækker følge, men man kunne selvf bare have lavet en OrderBy først ... :-) så var jeg nok også mer eller mindre kommet frem til arne's forslag.
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.