2011-01-23 17 views

risposta

24

Sia il numero che si verifica solo una volta nella matrice sia x

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

Da a^a = 0 e a^0 = a

numeri che si verificano nella coppia annullano e il risultato viene memorizzato in x

codice di lavoro in 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: buona soluzione, Prasoon :-) – Nawaz

+0

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

+0

@Prasoon: a proposito, è necessario il modello di funzione? 'sizeof (a)/sizeof (a [0])' non è abbastanza? – Nawaz

19
  1. Crea nuovo int i = 0
  2. XOR ogni elemento con i
  3. Dopo tutte le iterazioni ci sarà previsto numero in i
+1

O__O posso chiedere come questa soluzione è stata così ovvia per tutti qui? !! Non avrei potuto pensarci in giorni ... – Mehrdad

+0

@ Mehrdad: non lo so. Perché è un problema banale? – zerkms

+0

@zerkms: intendevi banale o banale? Ad ogni modo, però ... qualche consiglio su come imparare a pensare a soluzioni a problemi come questo che non hai mai visto prima? (Immagino tu abbia bisogno di essere intelligente ... non sono comunque così intelligente. :() – Mehrdad

1

Pozzo So solo della forza algo bruta ed è per attraversare tutta una serie e verificare

codice sarà come (in C#):

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

Si poteva ordinare l'array e poi trovare il primo elemento che doesn ne ho una coppia Ciò richiederebbe diversi loop per l'ordinamento e un ciclo per trovare il singolo elemento.

Ma un metodo più semplice sarebbe impostare i tasti doppi su zero o un valore che non è possibile nel formato corrente. Dipende anche dal linguaggio di programmazione, in quanto non è possibile modificare i tipi di chiave in C++ a differenza di C#. risposta

+0

Diverse soluzioni O (n) basate su XOR sono state ancora pubblicate –

+0

Non esiste un modo per determinare se è stata pubblicata una risposta senza ricaricare la pagina. Ma è la tua verità. – Vlad

+0

in realtà c'è un modo. Mentre stai scrivendo una risposta ed è stata postata un'altra risposta, dovresti vedere una barra in cima a quella nuova con il pulsante per caricarli nella pagina corrente (senza ricaricare). – zerkms

1

zerkms' in C++

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

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

Se si dispone di quantitativi che non possono essere ragionevolmente XORed (Grandi numeri interi o numeri rappresentati come stringhe, per esempio), un approccio alternativo che è anche O (n), (ma O (n) spazio piuttosto che O (1) spazio) sarebbe semplicemente utilizzare una tabella hash. L'algoritmo si presenta come:

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 

che avrei fatto il codice, C o C++, ma nessuno dei due ha tabelle hash costruito nel (non chiedetemi perché C++ non ha una tabella hash nel STL,. ma ha una mappa hash basata su un albero rosso-nero, perché non ho idea di cosa stessero pensando.) E, sfortunatamente, non ho a disposizione un compilatore C# per testare gli errori di sintassi, quindi ti sto dando Codice Java È piuttosto simile, però.

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

I contenitori con hash sono nel prossimo C++ 0x come 'std :: unordered_set' e' std :: unordered_map'. I compilatori attuali hanno già queste come estensioni della libreria TR1. – Blastfurnace

+0

Per completezza, sebbene non faccia parte del linguaggio principale, se si utilizza un sistema POSIX hcreate/hsearch è disponibile http://linux.die.net/man/3/hsearch – fayyazkl

Problemi correlati