Сложность вашего алгоритма для меня выглядит как O (n * d) .
Мой подход заключается не в том, чтобы вращаться на один d раз, а на один раз.
Вы можете рассчитать назначение элемента следующим образом:
Так что вместо a[i - 1] = a[i];
Вы бы сделали это:
a[(i + a.length - d) % a.length] = a[i];
Термин (i + a.length - d) % a.length
обрабатывает то, что вы всегда получаете значения в интервале: 0... a.length-1
Пояснение:
i + a.length - d
всегда положительно (до тех пор, пока d <= a.length)
но оно может быть больше / равно <code>a.length, что не допускается.
Так что возьмите напоминание о делении с a.length
.
Таким образом, вы получаете за каждую i= 0.. a.length-1
правильную новую позицию.
Как упомянуто Satyarth Agrahari :
Если d> n, вам нужно уменьшить d. d= d % a.length
, чтобы убедиться, что (i + a.length - d) % a.length
находится в требуемом интервале 0... a.length-1
. Результат тот же, потому что вращение на a.length похоже на бездействие вообще.