Zählen von doppelten Nummern in einer Liste

8

Ich habe eine Liste:

%Vor%

Jetzt muss ich ein Programm machen, das die doppelten Zahlen berechnet. Eine Nummer ist doppelt, wenn die Nummer davor gleich ist. Ich hoffe, Sie verstehen. Also 1 ist doppelt, 4 ist doppelt und wir haben 2 Doppel in 7,7,7.

    
Rik 01.10.2010, 13:01
quelle

7 Antworten

26

Hier ist eine Lösung in LINQ:

%Vor%

Dies erstellt eine andere Sequenz, indem das erste Element der Liste übersprungen wird. Anschließend werden Elemente aus beiden Sequenzen mit demselben Index und demselben Wert gefunden. Es wird in linearer Zeit ausgeführt, aber nur, weil eine Liste O(1) access by index anbietet.

    
Ani 01.10.2010 13:04
quelle
7

Hier ist ein Ansatz, der relativ einfach ist, nur einmal über die Sequenz iteriert und mit jeder Sequenz (nicht nur Listen) arbeitet:

%Vor%

Hier ist eine weitere, die noch einfacher ist, da es nur eine LINQ-Abfrage ist, aber sie verwendet Nebenwirkungen in der Where-Klausel, was unangenehm ist:

%Vor%

Eine dritte Alternative, die etwas sauberer ist, aber eine SelectConsecutive Methode verwendet, die im Grunde SelectPairs von diese Antwort , aber umbenannt, um etwas klarer zu sein:)

%Vor%     
Jon Skeet 01.10.2010 13:09
quelle
6

Jeder scheint zu versuchen, gute Wege zu finden, dies zu tun, also ist hier ein wirklich schlechter Weg:

%Vor%

Bitte mach es nicht so.

    
teedyay 01.10.2010 13:21
quelle
2

kann so etwas funktionieren:

%Vor%

BEARBEITEN:

Der obige Code führt nicht zum gewünschten Ergebnis. Hier ist eine bearbeitete Version, die sich von Anis eleganter Lösung inspirieren lässt::

%Vor%     
kjn 01.10.2010 13:05
quelle
0

Ein Beispiel, das (wahrscheinlich) besser funktioniert als die Verwendung von Linq, obwohl es wohl weniger elegant ist:

%Vor%     
teedyay 01.10.2010 14:12
quelle
0

Hier gehts mit der Antwort in c #:)

%Vor%     
Rajesh 01.10.2010 14:08
quelle
0

Sie könnten dies tun:

%Vor%

Das ist ein bisschen wie @ KJNs Antwort, außer dass ich denke, dass es die "doubles" - und "double doubles" -Klausel in der Frage etwas besser ausdrückt:

  1. gruppiert alle Ganzzahlen zusammen
  2. interessiert nur diejenigen, die mehr als einmal vorkommen ( g.Count() > 1 )
  3. wähle eine abgeflachte Liste der "Doppelgänger", die nach dem ersten ( g.Skip(1) )
  4. sind

PS: Wir gehen hier davon aus, dass GroupBy die Liste nicht zuerst sortiert und wenn ja, dass diese Sortierung nicht durch eine vorsortierte Liste negativ beeinflusst wird ...

    
Daren Thomas 01.10.2010 14:47
quelle

Tags und Links