轮转数组
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
**方法一:使用额外的数组
我们可以使用额外的数组来将每个元素放至正确的位置。用 n表示数组的长度,我们遍历原数组,将原数组下标为 i的元素放至新数组下标为 (i+k)mod n 的位置,最后将新数组拷贝至原数组即可
**
void rotate(int* nums, int numsSize, int k) {
int newArr[numsSize];
for (int i = 0; i < numsSize; ++i) {
newArr[(i + k) % numsSize] = nums[i];
}
for (int i = 0; i < numsSize; ++i) {
nums[i] = newArr[i];
}
}
**方法二:原地修改,且不使用额外空间
**
void reverse(int* arr,int left,int right){//逆置函数
while(left<right){
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k){
k%=numsSize;
reverse(nums,0,numsSize-k-1);
reverse(nums,numsSize-k,numsSize-1);
reverse(nums,0,numsSize-1);
}
想到了两种解法,后续可能会更新。