2012-08-09 10 views
5

für den Anfang nicht wiederholt, habe ich bei diesen Fragen einen Blick:Fundnummer, die in O (n) O (1) Raum

Given an array of integers where some numbers repeat 1 time, some numbers repeat 2 times and only one number repeats 3 times, how do you find the number that repeat 3 times

Algorithm to find two repeated numbers in an array, without sorting

dieses anders:

eine unsortierte Array von ganzen Zahlen mit einer eindeutigen Nummer und die übrigen Zahlen 3-mal wiederholen gegeben, dh:

{4,5,3, 5,3,4, 1, 4,3,5 } 

müssen wir diese eindeutige Nummer in O (n) Zeit und O (1) Raum finden

HINWEIS: dies ist keine Hausaufgaben, ich habe gerade eine nette Frage, die ich über

kam
+0

bezogen tun: [Finden eines Elements in einem Array, in dem jedes Element ungerade Anzahl von Malen wiederholt wird und nur eine erscheint einmal] (http: // Stackoverflow. com/q/7338070/4279) – jfs

Antwort

7

Was darüber one:

Idee: bitweise Addition mod 3

#include <stdio.h> 

int main() { 
    int a[] = { 1, 9, 9, 556, 556, 9, 556, 87878, 87878, 87878 }; 
    int n = sizeof(a)/sizeof(int); 
    int low = 0, up = 0; 

    for(int i = 0; i < n; i++) { 
     int x = ~(up & a[i]); 
     up &= x; 
     x &= a[i]; 
     up |= (x & low); 
     low ^= x; 
    } 
    printf("single no: %d\n", low); 
} 
+1

Ich habe gerade Ihren Algorithmus kompiliert und es scheint zu funktionieren und Sie verwenden nur bitweise Operationen. vorsichtig zu erklären, wie es funktioniert? – candyman

+0

@candyman: Nimm binäre Darstellung jeder Nummer in der Liste. Zählen Sie, wie oft jedes Bit auftritt (Modulo 3). Setzen Sie für jeden Zähler, der gleich Eins ist, das entsprechende Bit im Ergebniswert. Beispiel: {4,5,3, 5,3,4, 1, 4,3,5} -> Bit0 = 7 = 1, Bit1 = 3 = 0, Bit2 = 6 = 0 -> Ergebnis = 1 –

+0

aah hat es, dank Evgeny, ist Ihre Lösung auch dann richtig – candyman

Verwandte Themen