Napisz funkcję, która obraca tablicę liczb całkowitych o podaną liczbę k. k elementów od końca powinno przejść na początek tablicy, a wszystkie inne elementy powinny przejść w prawo, aby zrobić miejsce.
Rotacja powinna odbywać się na miejscu.
Algorytm nie powinien działać w więcej niż O (n), gdzie n jest rozmiarem tablicy.
Do wykonania operacji należy również użyć stałej pamięci.
Na przykład,
jeśli tablica jest inicjowana z elementami arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}
rotate (arr, 3) spowoduje, że elementami będą {7, 8, 9, 1, 2, 3, 4, 5, 6}
rotate (arr, 6) spowoduje {4, 5, 6, 7, 8, 9, 1, 2, 3}
popularity-contest
array-manipulation
drobnoustrój
źródło
źródło
Odpowiedzi:
C (104)
Zminimalizowane:
źródło
a <-- b
APL (4)
Nie jestem pewien, czy APL faktycznie tego wymagało, ale w implementacji, którą widziałem (elementy wewnętrzne), zajęłoby to czas proporcjonalny do
A
stałej pamięci.źródło
{⍵⌽⍨-⍺}
lub{⌽⍺⌽⌽⍵}
. W NARS2000 może być elegancko napisany jako⌽⍢⌽
.Oto długo rozwinięta wersja C pomysłu Colina.
źródło
O(log(n))
działa? Spójrz naby
bycie 1, twoja pętla `j 'to s_arr / g lub N - to operacje O (N)do
Nie jestem pewien, jakie są kryteria, ale ponieważ bawiłem się algorytmem, oto mój wpis:
Dla pewności zagram w golfa; 126 bajtów, można skrócić:
źródło
Nie widzę tu zbyt wielu rozwiązań C ++, więc pomyślałem, że spróbuję tego, ponieważ nie liczy znaków.
Jest to prawdziwa rotacja „na miejscu”, dlatego wykorzystuje 0 dodatkowego miejsca (oprócz wymiany technicznej i 3 liczb całkowitych), a ponieważ pętla ma dokładnie N, spełnia również złożoność O (N).
źródło
std::rotate
ponieważ ten rodzaj pokonuje celJeśli wykonasz każdy z możliwych cykli obrotu kolejno o n (jest ich GCD (n, len (arr))), to potrzebujesz tylko jednej tymczasowej kopii elementu tablicy i kilku zmiennych stanu. W ten sposób w Pythonie:
źródło
cycle
zmienna ma niestały rozmiar. Będziesz musiał wygenerować tę tablicę podczas podróży.C (137 znaków)
Funkcja
rotate
zmniejszona do 137 znaków:źródło
Współczynnik ma wbudowany typ dla tablic obrotowych
<circular>
, więc w rzeczywistości jest to operacja O (1):Mniej cheatyczna Factor odpowiednik imponującego rozwiązania C Bena Voigta:
źródło
JavaScript 45
Poszedłem na golfa, bo lubię golfa. Ma maksymalną wartość O (N), o ile
t
<= rozmiar tablicy.Aby obsłużyć
t
dowolną proporcję w O (N), można zastosować następujące elementy (o wadze 58 znaków):Nie zwraca, edytuje tablicę w miejscu.
źródło
r(o,t) => rot
REBEL - 22
Dane wejściowe: k wyrażone jako jedność całkowita za
_
pomocą cyfry, następnie spacja, a następnie rozdzielana spacjami tablica liczb całkowitych.Dane wyjściowe: spacja, a następnie tablica obrócona.
Przykład:
Stan końcowy:
Wyjaśnienie:
W każdej iteracji, zastępuje jeden
_
i tablicę[array] + tail
ztail + [array]
.Przykład:
źródło
O(n)
i robisz ton
razy.Jawa
Demo tutaj .
Minified JavaScript, 114 :
źródło
Haskell
W rzeczywistości jest to θ (n), ponieważ podział to θ (k), a złączenie to θ (nk). Nie jestem jednak pewien co do pamięci.
źródło
Python 3
Stała
złożoność czasowa pamięci O (n)
źródło
Pyton
źródło
pyton
źródło
vb.net O (n) (nie pamięć stała)
źródło
Rubin
źródło
C (118)
Prawdopodobnie był nieco zbyt łagodny w przypadku niektórych specyfikacji. Wykorzystuje pamięć proporcjonalną do
shift % length
. Może również obracać się w przeciwnym kierunku, jeśli minie ujemna wartość przesunięcia.źródło
Python 2, 57
Gdybym tylko
l[-n:len(l)-n]
działał tak, jak bym tego oczekiwał. Po prostu wraca[]
z jakiegoś powodu.źródło
Czy ktoś mógłby sprawdzić, czy to rzeczywiście spełnia wymagania? Myślę, że tak, ale nie studiowałem jeszcze CS.
źródło
C ++, 136
źródło
Jawa
Zamień ostatnie k elementów na pierwsze k elementów, a następnie obróć pozostałe elementy o k. Jeśli na końcu pozostało mniej niż k elementów, obróć je o k% liczby pozostałych elementów. Nie sądzę, żeby ktokolwiek powyżej przyjął to podejście. Wykonuje dokładnie jedną operację wymiany dla każdego elementu, robi wszystko na swoim miejscu.
źródło
Perl 5 , 42 bajtów
Wypróbuj online!
Podprogram wykorzystuje obrót jako pierwszy parametr, a odniesienie do tablicy jako drugi. Czas pracy jest stały na podstawie odległości obrotu. Rozmiar tablicy nie wpływa na czas działania. Tablica jest modyfikowana na miejscu poprzez usunięcie elementu z prawej strony i umieszczenie go po lewej stronie.
źródło