1.题目描述
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
2.解题思路
1)申请一个长为k的数组s1保存后面k个元素
2)右移动k个元素
3)s1复制到原来的数组前面k个
4)注意k大于numsize就取模
3.代码
cpp
void rotate(int* nums, int numsSize, int k) {
// 1. 合法性校验:处理空指针、空数组或无需旋转的情况
if (nums == NULL || numsSize <= 1 || k <= 0) {
return;
}
// 2. 对k取模,避免旋转次数超过数组长度(旋转numsSize次等于没旋转)
k = k % numsSize;
if (k == 0) {
return;
}
int s1[k];
for(int i = 0;i<=k-1;i++ ){
s1[i] = nums[numsSize-k+i];//s1保存了后k个元素
}
for(int j = numsSize-k-1; j>=0 ; j--){
nums[j+k]=nums[j];//后移k个
}
for(int n = 0;n <= k-1;n++){
nums[n] = s1[n];
}
return;
}