2012-08-09 6 views
5

pour commencer, j'ai eu un coup d'œil à ces questions:trouver le numéro qui ne se répète pas dans O (n) O (1) Espace

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

celui-ci différent:

donné un tableau d'entiers non triés avec un numéro unique et les nombres de repos répéter 3 fois, soit:

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

nous devons trouver ce numéro unique dans O (n) et O (1) Espace

NOTE: ce n'est pas un devoir, juste que je une bonne question, je suis tombé sur

+0

liés: [Trouver un élément dans un tableau où chaque élément est répété nombre impair de fois et une seule apparaît une fois] (http: // stackoverflow. com/q/7338070/4279) – jfs

Répondre

7

Qu'en est-ce un:

Idée: faire mod plus bitwise 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

Je viens de compiler votre algorithme et il semble fonctionner et vous utilisez uniquement des opérations au niveau du bit. Vous voulez expliquer comment cela fonctionne? – candyman

+0

@candyman: Représente la représentation binaire de chaque nombre de la liste. Comptez combien de fois chaque bit se produit (modulo 3). Pour chaque compteur, c'est-à-dire égal à un, définissez le bit correspondant dans la valeur du résultat. Exemple: {4,5,3, 5,3,4, 1, 4,3,5} -> bit0 = 7 = 1, bit1 = 3 = 0, bit2 = 6 = 0 -> résultat = 1 –

+0

il, merci Evgeny, votre solution est également correcte alors – candyman

Questions connexes