Предположим, у нас есть массив длины с указателями, указывающими на какое-то место в массиве: процесс « прыжка с указателем » установит каждый указатель на то место, на которое указывает указатель.
Для этой задачи указатель - это (основанный на нуле) индекс элемента массива, это означает, что каждый элемент в массиве будет больше или равен и меньше, чем . Используя эту запись, процесс можно сформулировать следующим образом:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Это означает (для этой задачи), что указатели обновляются на месте в последовательном порядке (т. Е. Сначала более низкие индексы).
пример
Давайте рассмотрим пример, :
Итак, после одной итерации « прыжка с указателем » мы получаем массив .
Вызов
Учитывая массив с индексами, выведите массив, полученный итерацией вышеописанного прыжка указателя, пока массив больше не изменится.
правила
Ваша программа / функция будет принимать и возвращать / выводить один и тот же тип, список / вектор / массив и т. Д., Которые
- гарантированно будет не пустым и
- гарантированно содержит только записи .
Варианты: вы можете выбрать
- использовать индексирование на основе 1 или
- использовать фактические указатели,
однако вы должны упомянуть об этом в своем представлении.
Контрольные примеры
[0] → [0]
[1,0] → [0,0]
[1,2,3,4,0] → [2,2,2,2,2]
[0,1,1,1,0,3] → [0,1,1,1,0,1]
[4,1,3,0,3,2] → [3,1,3,3,3,3]
[5,1,2,0,4,5,6] → [5,1,2,5,4,5,6]
[9,9,9,2,5,4,4,5,8,1,0,0] → [1,1,1,1,4,4,4,4,8,1,1,1]
n
качестве дополнительного ввода?
#[[#]]&~FixedPoint~#&
.