πŸ–₯ Π—Π°Π΄Π°Ρ‡Π° ΠΎ цикличСском сдвигС



ЦикличСский сдвиг массива β€” это ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΡ€ΠΎΠΌΠ΅ послСднСго сдвигаСтся Π²ΠΏΡ€Π°Π²ΠΎ, Π° послСдний элСмСнт массива становится ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.



На Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ΄Π°ΡŽΡ‚ΡΡ массив A ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число K. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ цикличСский сдвиг Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива K Ρ€Π°Π· ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ массив.



НапримСр, для Π΄Π°Π½Π½Ρ‹Ρ…:



A = [2, 5, 1, 4, 6]

K = 3




ЦикличСский сдвиг Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Ρ‚Ρ€ΠΈΠΆΠ΄Ρ‹:



[2, 5, 1, 4, 6] -> [6, 2, 5, 1, 4]

[6, 2, 5, 1, 4] -> [4, 6, 2, 5, 1]

[4, 6, 2, 5, 1] -> [1, 4, 6, 2, 5]




И ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ



[1, 4, 6, 2, 5]



Если K = 0, Ρ‚ΠΎ сдвиг Π½Π΅ дСлаСтся.



Для K = 5:



[2, 5, 1, 4, 6] -> [2, 5, 1, 4, 6]



НаивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:



1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

2. Π”Π΅Π»Π°Π΅ΠΌ это K Ρ€Π°Π·.



def rotate(A, K):

""" Rotates a list K times """

if not A:

return []



for i in range(K):

A = rotate_once(A)

return A





def rotate_once(A):

""" Rotates a list once """

A.insert(0, A[-1])

del A[-1]

return A



Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ insert() ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Π΅Ρ‚ всС элСмСнты исходного списка. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ΠΎ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ послС len(A) Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΉ список возвращаСтся Π² исходноС состояниС.



Π˜Π½Π΄Π΅ΠΊΡΡ‹ элСмСнтов Π² Π½ΠΎΠ²ΠΎΠΌ массивС нСслоТно Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ аналитичСски, поэтому:



def rotate(A, K):

""" Rotates a list K times """

result = []

if K == 0:

return A

else:

for i in range(len(A)):

new_index = (i - K) % len(A)

result.append(A[new_index])

return result




Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ

β–ͺ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄

β–ͺ ΠΈ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ увСличиваСтся Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… K.



@python_job_interview