Escreva uma função que gire uma matriz inteira por um determinado número k. Os elementos k do final devem se mover para o início da matriz e todos os outros elementos devem se mover para a direita para criar espaço.
A rotação deve ser feita no local.
O algoritmo não deve ser executado em mais de O (n), onde n é o tamanho da matriz.
Também é necessário usar uma memória constante para executar a operação.
Por exemplo,
se a matriz for inicializada com elementos arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}
rotate (arr, 3) fará com que os elementos sejam {7, 8, 9, 1, 2, 3, 4, 5, 6}
rotate (arr, 6) resultará em {4, 5, 6, 7, 8, 9, 1, 2, 3}
popularity-contest
array-manipulation
microbiano
fonte
fonte
Respostas:
C (104)
Minificado:
fonte
a <-- b
APL (4)
Não tenho certeza se o APL realmente o exigia, mas na implementação que eu vi (o interior de) isso levaria um tempo proporcional à
A
memória constante.fonte
{⍵⌽⍨-⍺}
ou{⌽⍺⌽⌽⍵}
. No NARS2000, pode ser elegantemente escrito como⌽⍢⌽
.Aqui está uma versão em C da idéia de Colin.
fonte
O(log(n))
operações. Olhe paraby
ser 1, seu loop `j 'é s_arr / g ou N - essas são operações O (N)C
Não tenho certeza qual é o critério, mas desde que me diverti com o algoritmo, aqui está minha entrada:
Também vou jogar golfe por uma boa medida; 126 bytes, podem ser reduzidos:
fonte
Não vejo muitas soluções C ++ aqui, então achei que tentaria essa, uma vez que não conta caracteres.
Esta é a rotação "in-loco" verdadeira, portanto, usa 0 espaço extra (exceto troca tecnicamente e 3 ints) e, como o loop é exatamente N, também atende à complexidade O (N).
fonte
std::rotate
porque esse tipo de derrota a finalidadeSe você executar cada um dos possíveis ciclos de rotações n por vez (existem GCD (n, len (arr))), será necessário apenas uma cópia temporária de um elemento da matriz e algumas variáveis de estado. Assim, em Python:
fonte
cycle
variável é de tamanho não constante. Você precisará gerar essa matriz à medida que avança.C (137 caracteres)
Função
rotate
reduzida para 137 caracteres:fonte
O fator possui um tipo interno para matrizes rotativas
<circular>
; portanto, essa é realmente uma operação O (1):Um fator de fator menos enganador da impressionante solução C de Ben Voigt:
fonte
JavaScript 45
Fui para o golfe de qualquer maneira, porque eu gosto de golfe. É no máximo O (N), contanto que
t
seja <= tamanho da matriz.Para lidar
t
com qualquer proporção em O (N), o seguinte pode ser usado (pesando 58 caracteres):Não retorna, edita a matriz no lugar.
fonte
r(o,t) => rot
REBEL - 22
Entrada: k expressa como um número inteiro unário usando
_
como dígito, seguido por um espaço e, em seguida, uma matriz de números delimitados por espaço.Saída: um espaço e, em seguida, a matriz girada.
Exemplo:
Estado final:
Explicação:
Em cada iteração, ele substitui um
_
e uma matriz[array] + tail
portail + [array]
.Exemplo:
fonte
O(n)
, e você faz isson
algumas vezes.Java
Demonstração aqui .
Javascript reduzido , 114 :
fonte
Haskell
Na verdade, é θ (n), pois a divisão é θ (k) e a junção é θ (nk). Não tenho certeza sobre a memória embora.
fonte
Python 3
Memória constante
O (n) complexidade de tempo
fonte
Pitão
fonte
Pitão
fonte
vb.net O (n) (não memória constante)
fonte
Rubi
fonte
C (118)
Provavelmente foi um pouco branda com algumas das especificações. Usa memória proporcional a
shift % length
. Também é capaz de girar na direção oposta se um valor de deslocamento negativo for passado.fonte
Python 2, 57
Se ao menos
l[-n:len(l)-n]
funcionasse como eu esperava. Apenas retorna[]
por algum motivo.fonte
Alguém poderia verificar se isso realmente atende aos requisitos? Eu acho que sim, mas ainda não estudei CS.
fonte
C ++, 136
fonte
Java
Troque os últimos k elementos pelos primeiros k elementos e gire os elementos restantes por k. Quando você tiver menos de k elementos no final, gire-os pelo número de k% de elementos restantes. Acho que ninguém acima adotou essa abordagem. Executa exatamente uma operação de troca para cada elemento, faz tudo no lugar.
fonte
Perl 5 , 42 bytes
Experimente online!
A sub-rotina leva a distância para girar como o primeiro parâmetro e uma referência à matriz como o segundo. O tempo de execução é constante com base na distância da rotação. O tamanho da matriz não afeta o tempo de execução. A matriz é modificada no local removendo um elemento da direita e colocando-o à esquerda.
fonte