Dana tablica [a1b2c3d4] przekonwertowana na [abcd1234]
Ograniczenia:
O (1) przestrzeńNa czasTo nie jest pytanie domowe, ale ciekawe pytanie, na które natrafiłem.
Oto kilka rozwiązań, które mogłem wymyślić, ale nic, co mogłoby to zrobić w danych ograniczeniach.
Metoda 1
* Z pamięcią O (n) *
Rekurencyjnie podziel tablicę na dwie części. (kontynuuj dzielenie aż do rozmiaru <= 2 dla każdego problemu sub)Sortuje każdy problem sub z tablicą jako pierwszą i liczbami na końcu.Scal tablice problemów podrzędnychMetoda 2
W czasie O (n log n)
Posortuj porządek Lexicographical oparty na tablicy, aby stał się 1234abcdOdwróć obie połowy tablicy 4321dcbaOdwróć cały łańcuch abcd1234Metoda 3
Jeśli zdefiniowano zakres liczb
Również jeśli przypadek był taki, że liczby są w określonym zakresie, mogę zainicjować ścieżkę int powiedzieć = 0; I ustaw odpowiedni bit, gdy natrafię na liczbę w tablicy np. (1 << a [2]). 1. Zamień alfabety na pierwszą połowę tablicy 2. Oznacz liczby w zmiennej ścieżki 3. później użyj ścieżki, aby wypełnić drugą połowę tablicy.
Metoda 4 Możemy użyć metody 3 z HashMap, jeśli chcemy usunąć ograniczenie zakresu liczb całkowitych, ale wtedy będzie potrzebować więcej pamięci.
Nie można wymyślić lepszego sposobu rozwiązania ogólnego problemu w czasie O (1) i przestrzeni O (n).
Ogólny problem dotyczy:
Biorąc pod uwagę sekwencję x1y1x2y2x3y3 .... xnyn gdzie x1, x2 są alfabetami x1 <x2 <.... <xn i y1y2 ... yn są liczbami całkowitymi. y1 <y2 <.... <yn Ustaw wyjście jako x1x2 ... xny1y2 ... yn
Jakieś sugestie ?