# 189. Rotate Array
題目:<https://leetcode.com/problems/rotate-array/>
解法:首先此動作是循環的,所以 k 先 mod 陣列長度,就可以確定最少移動步數,接著由於陣列長度可能很大,所以採每個元素依序移動的方式,先暫存目前值,移動到目標位置,再暫存目標位置的值,將前一個暫存值置入陣列目標位置後,再重複執行,若目標位置回到起始位置,則起始位置加1,直到所有以替換所有元素。
Python3:
``` python 3
class Solution:
def rotate(self, nums: list[int], k: int) -> None:
length = len(nums)
k %= length
if k == 0 or k == length:
return
idx = start = 0
prev = nums[idx]
count = 0
while count < length:
idx = (idx + k) % length
tmp = nums[idx]
nums[idx] = prev
prev = tmp
count += 1
if start == idx:
start += 1
idx = start
prev = nums[idx]
if __name__ == '__main__':
nums = [1, 2, 3, 4, 5, 6, 7]
k = 3
Solution().rotate(nums, k)
print(nums)
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
void rotate(int* nums, int numsSize, int k) {
k %= numsSize;
if (k == 0 || k == numsSize)
return;
int start, idx, prev, count;
idx = start = 0;
prev = nums[idx];
count = 0;
while (count < numsSize) {
idx = (idx + k) % numsSize;
int tmp = nums[idx];
nums[idx] = prev;
prev = tmp;
count++;
if (start == idx) {
start++;
idx = start;
prev = nums[idx];
}
}
}
int main() {
int nums[] = {1, 2, 3, 4, 5, 6, 7};
int numsSize = sizeof(nums) / sizeof(nums[0]);
int k = 3;
rotate(nums, numsSize, k);
for (int i = 0; i < numsSize; i++)
printf("%d\n", nums[i]);
return 0;
}
```
###### tags: `leetcode` `array`