题目:
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
解析:
nums = [1,2,3,4,5,6,7]
输出:[5,6,7,1,2,3,4]
4 3 2 1 5 6 7 前n-k个逆置
4 3 2 1 7 6 5 后k个逆置
5 6 7 1 2 3 4 整体逆置
时间复杂度:O(N) 空间复杂度:O(1)
源代码:
void Reverse (int* nums,int left,int right)
{
while(left<right)
{
int tmp =nums[left];
nums[left]=nums[right];
nums[right]=tmp;
++left;
--right;
}
}
void rotate(int* nums, int numsSize, int k) {
if(k>=numsSize)
k%=numsSize;
Reverse(nums,0,numsSize-k-1);
Reverse(nums,numsSize-k,numsSize-1);
Reverse(nums,0,numsSize-1);
}
可以在编译器上验证的代码:
#include <stdio.h>
void Reverse (int nums[],int left,int right)
{
while(left<right)
{
int tmp =nums[left];
nums[left]=nums[right];
nums[right]=tmp;
++left;
--right;
}
}
int main() {
void Reverse(int nums[],int left,int right);
int nums[]={1,2,3,4,5,6,7};
int numsSize=7;
int k = 3;
Reverse(nums,0,numsSize-k-1);
Reverse(nums,numsSize-k,numsSize-1);
Reverse(nums,0,numsSize-1);
for(int i=0;i<7;i++){
//TODO
printf("%d",nums[i]);
}
return 0;
}