È possibile inventare un XOR 3nary (chiamarlo XOR3
) operazione che opera in base 3 anziché in base 2 e prende semplicemente ogni 3 cifre modulo 3 (quando di consueto XOR
prende 2 cifre modulo 2).
Quindi, se si XOR3
tutti i numeri (convertendoli prima in 3nari) in questo modo, verrà lasciato con il numero univoco (in base 3 quindi sarà necessario riconvertirlo).
La complessità non è esattamente lineare, tuttavia, poiché le conversioni da/verso base 3 richiedono un tempo logaritmico aggiuntivo. Tuttavia, se l'intervallo di numeri è costante, anche il tempo di conversione è costante.
Codice in C++ (intenzionalmente verbose):
vector<int> to_base3(int num) {
vector<int> base3;
for (; num > 0; num /= 3) {
base3.push_back(num % 3);
}
return base3;
}
int from_base3(const vector<int> &base3) {
int num = 0;
for (int i = 0, three = 1; i < base3.size(); ++i, three *= 3) {
num += base3[i] * three;
}
return num;
}
int find_unique(const vector<int> &a) {
vector<int> unique_base3(20, 0); // up to 3^20
for (int num : a) {
vector<int> num_base3 = to_base3(num);
for (int i = 0; i < num_base3.size(); ++i) {
unique_base3[i] = (unique_base3[i] + num_base3[i]) % 3;
}
}
int unique_num = from_base3(unique_base3);
return unique_num;
}
int main() {
vector<int> rands { 1287318, 172381, 5144, 566546, 7123 };
vector<int> a;
for (int r : rands) {
for (int i = 0; i < 3; ++i) {
a.push_back(r);
}
}
a.push_back(13371337); // unique number
random_shuffle(a.begin(), a.end());
int unique_num = find_unique(a);
cout << unique_num << endl;
}
Cosa avete provato finora? – Renzo
per che cosa hai intervistato? – jdl
per quanto riguarda i limiti di memoria e l'intervallo di numeri? – dreamzor