Напишите функцию, которая вращает целочисленный массив на заданное число k. k элементов из конца должны переместиться в начало массива, а все остальные элементы должны переместиться вправо, чтобы освободить место.
Вращение должно быть сделано на месте.
Алгоритм не должен работать больше, чем O (n), где n - размер массива.
Также постоянная память должна использоваться для выполнения операции.
Например,
если массив инициализируется с элементами arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}
rotate (arr, 3) приведет к тому, что элементы будут {7, 8, 9, 1, 2, 3, 4, 5, 6}
rotate (arr, 6) приведет к {4, 5, 6, 7, 8, 9, 1, 2, 3}
popularity-contest
array-manipulation
микробный
источник
источник
Ответы:
С (104)
уменьшенная:
источник
a <-- b
APL (4)
Я не уверен, действительно ли APL требовал этого, но в реализации, которую я видел (внутренности), это потребовало бы времени, пропорционального
A
и постоянной памяти.источник
{⍵⌽⍨-⍺}
или{⌽⍺⌽⌽⍵}
. В NARS2000 это может быть изящно написано как⌽⍢⌽
.Вот длинная версия C-версии идеи Колина.
источник
O(log(n))
операции. Посмотрите наby
1, ваш цикл `j 's_arr / g или N - это O (N) операцийС
Не уверен, каковы критерии, но так как я получил удовольствие от алгоритма, вот моя запись:
Я тоже буду играть в гольф для хорошей меры; 126 байт, могут быть сокращены:
источник
Я не вижу здесь много решений C ++, поэтому я решил попробовать это, так как в нем не учитываются символы.
Это действительно вращение «на месте», поэтому используется 0 лишних пробелов (кроме технически подкачки и 3 дюймов), и поскольку цикл равен ровно N, он также удовлетворяет сложности O (N).
источник
std::rotate
потому что такого рода поражение целиЕсли вы выполняете каждый из возможных циклов поворотов по n (по очереди их GCD (n, len (arr))), то вам потребуется только одна временная копия элемента массива и несколько переменных состояния. Вот так в Python:
источник
cycle
переменная имеет непостоянный размер. Вы должны будете сгенерировать этот массив, как вы идете.C (137 символов)
Функция
rotate
уменьшена до 137 символов:источник
Фактор имеет встроенный тип для вращающихся массивов
<circular>
, так что на самом деле это операция O (1):Менее обманчивый фактор-фактор впечатляющего C-решения Бена Фойгта:
источник
JavaScript 45
В любом случае ходил в гольф, потому что я люблю гольф. Максимальное значение O (N)
t
равно <= размеру массива.Для обработки
t
любой пропорции в O (N) можно использовать следующее (весом до 58 символов):Не возвращает, редактирует массив на месте.
источник
r(o,t) => rot
REBEL - 22
Входные данные: k выражается как унарное целое число, используя
_
цифру, затем пробел, затем массив целых чисел, разделенных пробелом.Выход: пробел, затем массив повернут.
Пример:
Конечное состояние:
Объяснение:
На каждой итерации он заменяет единицу
_
и массив[array] + tail
наtail + [array]
.Пример:
источник
O(n)
, и вы делаете этоn
раз.Ява
Демо здесь .
Минимизированный Javascript, 114 :
источник
Haskell
На самом деле это θ (n), поскольку разбиение - θ (k), а объединение - θ (nk). Не уверен насчет памяти, хотя.
источник
Python 3
Постоянная память
O (n) временной сложности
источник
питон
источник
питон
источник
vb.net O (n) (не постоянная память)
источник
Рубин
источник
С (118)
Вероятно, был слишком мягок с некоторыми спецификациями. Использует память, пропорциональную
shift % length
. Также может вращаться в противоположном направлении, если передается отрицательное значение сдвига.источник
Python 2, 57
Если бы
l[-n:len(l)-n]
работал так, как я ожидал. Это просто возвращается[]
по какой-то причине.источник
Может кто-нибудь проверить, действительно ли это соответствует требованиям? Я думаю, что это так, но я не изучал CS (пока).
источник
С ++, 136
источник
Ява
Поменяйте местами последние k элементов с первыми k элементами, а затем поверните оставшиеся элементы на k. Если в конце осталось менее k элементов, поверните их на k% оставшихся элементов. Я не думаю, что кто-то выше принял этот подход. Выполняет ровно одну операцию подкачки для каждого элемента, делает все на месте.
источник
Perl 5 , 42 байта
Попробуйте онлайн!
Подпрограмма принимает расстояние для поворота в качестве первого параметра и ссылку на массив в качестве второго. Время выполнения является постоянным в зависимости от расстояния вращения. Размер массива не влияет на время выполнения. Массив изменяется на месте, удаляя элемент справа и помещая его слева.
источник