2012-08-09 16 views
5

para empezar, tuve un vistazo a las siguientes preguntas:número hallazgo que no se repite en O (n) tiempo O (1) Espacio

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

éste diferente:

dado un vector sin clasificar de números enteros con un número único y los números de descanso repiten 3 veces, es decir :

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

tenemos que encontrar este número único en el tiempo O (n) y O (1) Espacio

NOTA: esto no es una tarea, acabo una buena pregunta que me encontré con

+0

relacionada: [Encontrar un elemento de una matriz donde cada elemento se repite número impar de veces y sólo una aparece una vez] (http: // stackoverflow. com/q/7338070/4279) – jfs

Respuesta

7

¿Qué pasa con este uno:

Idea: hacer adición bit a bit 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

Acabo de compilar su algoritmo y parece funcionar y solo utiliza operaciones bit a bit. ¿Cuidar para explicar cómo funciona? – candyman

+0

@candyman: Tome una representación binaria de cada número en la lista. Cuente cuántas veces ocurre cada bit (módulo 3). Para cada contador, que es igual a uno, configure el bit correspondiente en el valor del resultado. Ejemplo: {4,5,3, 5,3,4, 1, 4,3,5} -> bit0 = 7 = 1, bit1 = 3 = 0, bit2 = 6 = 0 -> resultado = 1 –

+0

aah got esto, gracias Evgeny, tu solución también es correcta entonces – candyman

Cuestiones relacionadas