2011-01-23 61 views

Respuesta

24

Deje que el número que ocurre sólo una vez en la matriz sea x

x <- a[1] 
for i <- 2 to n 
    x <- x^a[i] 
return x 

Desde a^a = 0 y a^0 = a

números que se dan en pares cancelan y el resultado se almacena en x

código de trabajo en C++

#include <iostream> 

template<typename T, size_t N> 
size_t size(T(&a)[N]) 
{ 
    return N; 
} 
int main() 
{ 
    int a [] = {1,2,3,4,3,1,2}; 
    int x = a[0]; 
    for (size_t i = 1; i< size(a) ; ++i) 
    { 
     x = x^a[i]; 
    } 
    std::cout << x; 
} 
+1

@Prasoon: buena solución, Prasoon :-) – Nawaz

+0

@Nawaz: :) [.....] –

+0

@Prasoon: por cierto, ¿es necesaria la plantilla de función? 'sizeof (a)/sizeof (a [0])' no es suficiente? – Nawaz

19
  1. crear nuevas int i = 0
  2. XOR cada elemento con i
  3. Después de todas las iteraciones no se espera que el número de i
+1

O__O ¿Puedo preguntar cómo esta solución fue tan obvia para todos aquí? No podría haberlo pensado en días ... – Mehrdad

+0

@Mehrdad: no sé. Porque es un problema de trivialidades? – zerkms

+0

@zerkms: ¿Te refieres trivia o trivial? De cualquier manera, sin embargo ... ¿alguna recomendación sobre cómo aprender a pensar en soluciones a problemas como este que no has visto antes? (Supongo que debes ser inteligente ... aunque no estoy seguro de ser tan listo. :() – Mehrdad

1

Bien Yo sólo sé de la fuerza de algo Bruto y es para atravesar gama entera y comprobar

Código será como (en C#):

k=0; 
for(int i=0 ; i < array.Length ; i++) 
{ 
    k ^= array[i]; 
} 
return k; 
0

Usted puede ordenar la matriz y luego encontrar el primer elemento que doesn No tengo un par. Eso requeriría varios bucles para clasificar y un bucle para encontrar el elemento individual.

Pero un método simplier sería establecer las teclas dobles a cero o un valor que no es posible en el formato actual. Depende también del lenguaje de programación, ya que no puede cambiar los tipos de clave en C++ a diferencia de C#. respuesta

+0

Ya se han publicado varias soluciones de O (n) basadas en XOR –

+0

No hay forma de determinar si se ha publicado una respuesta sin volver a cargar la página. Pero es tu verdad – Vlad

+0

en realidad hay una manera. Mientras escribe una respuesta y se ha publicado una respuesta más, debería ver una barra en la parte superior sobre la nueva con el botón para cargarlas en la página actual (sin recargar). – zerkms

1

zerkms' en C++

int a[] = { 1,2,3,4,3,1,2 }; 

int i = std::accumulate(a, a + 7, 0, std::bit_xor<int>()); 
2

Si usted tiene cantidades que no pueden ser XORed razonable (Grandes números enteros o números representan como cadenas, por ejemplo), un enfoque alternativo, que también es O (n), (pero O (n) espacio en lugar de O (1) espacio) sería simplemente usar una tabla hash. El algoritmo se parece a:

Create a hash table of the same size as the list 
For every item in the list: 
    If item is a key in hash table 
     then remove item from hash table 
     else add item to hash table with nominal value 
At the end, there should be exactly one item in the hash table 

lo haría código, C o C++, pero ninguno de ellos ha tablas hash construido en (No me pregunte por qué C++ no tiene una tabla hash en el STL,. pero tiene un mapa hash basado en un árbol rojo-negro, porque no tengo idea de lo que estaban pensando.) Y, desafortunadamente, no tengo un compilador C# a mano para probar los errores de sintaxis, así que te doy Código Java Es bastante similar, sin embargo.

import java.util.Hashtable; 
import java.util.List; 

class FindUnique { 
    public static <T> T findUnique(List<T> list) { 
     Hashtable<T,Character> ht = new Hashtable<T,Character>(list.size()); 
     for (T item : list) { 
      if (ht.containsKey(item)) { 
       ht.remove(item); 
      } else { 
       ht.put(item,'x'); 
      } 
     } 
     return ht.keys().nextElement(); 
    } 
} 
+0

Los contenedores hash están en el próximo C++ 0x como 'std :: unordered_set' y' std :: unordered_map'. Los compiladores actuales ya tienen estas como extensiones de biblioteca TR1. – Blastfurnace

+0

Para completar, aunque no es parte del lenguaje central, si está en un sistema POSIX hcreate/hsearch está disponible http://linux.die.net/man/3/hsearch – fayyazkl

Cuestiones relacionadas