Я работал над решением задачи: цикл в круговом массиве.Мне бы хотелось, чтобы кто-нибудь помог мне понять, как мы знаем, как использовать оператор модуля в этой строке кода?
next_index = (current_index + arr[current_index]) % len(arr)
Описание проблемы : Мы находимсядан массив, содержащий положительные и отрицательные числа.Предположим, что массив содержит число «M» по определенному индексу.Теперь, если «М» положительный, мы будем двигаться вперед «М» индексы, а если «М» отрицательный, двигаться назад «М» индексы.Вы должны предположить, что массив является круглым, что означает две вещи:
Если, двигаясь вперед, мы достигнем конца массива, мы перейдем к первому элементу, чтобы продолжить движение.Если при движении назад мы достигнем начала массива, мы перейдем к последнему элементу, чтобы продолжить движение.Напишите метод, чтобы определить, есть ли в массиве цикл.Цикл должен иметь более одного элемента и должен следовать в одном направлении, что означает, что цикл не должен содержать как движения вперед, так и назад.Пример:
Input: [1, 2, -1, 2, 2]
Output: true
Explanation: The array has a cycle among indices: 0 -> 1 -> 3 -> 0
Код :
def circular_array_loop_exists(arr):
for i in range(len(arr)):
is_forward = arr[i] >= 0 # if we are moving forward or not
slow, fast = i, i
# if slow or fast becomes '-1' this means we can't find cycle for this number
while True:
# move one step for slow pointer
slow = find_next_index(arr, is_forward, slow)
# move one step for fast pointer
fast = find_next_index(arr, is_forward, fast)
if (fast != -1):
# move another step for fast pointer
fast = find_next_index(arr, is_forward, fast)
if slow == -1 or fast == -1 or slow == fast:
break
if slow != -1 and slow == fast:
return True
return False
def find_next_index(arr, is_forward, current_index):
direction = arr[current_index] >= 0
if is_forward != direction:
return -1 # change in direction, return -1
# ********** This is the line in question ***********
next_index = (current_index + arr[current_index]) % len(arr)
# ********** This is the line in question ***********
# one element cycle, return -1
if next_index == current_index:
next_index = -1
return next_index
def main():
print(circular_array_loop_exists([1, 2, -1, 2, 2]))
print(circular_array_loop_exists([2, 2, -1, 2]))
print(circular_array_loop_exists([2, 1, -1, -2]))
main()