给定一个数组,右旋k位,k为非负数,也就是将数组的后面k位,整体移动到数组前面。空间复杂度为O(1)。

//第一次尝试:
//本题若是没有空间复杂度的要求,那么我们可以使用一个取巧的办法,假设数组nums[]={1,2,3,4,5,6,7},不管右旋多少位,
// 始终都是{1,2,3,4,5,6,7,1,2,3,4,5,6,7}这个数组的子集,那么有了k和nums数组大小的值,就可以找到旋转之后数组内容;
//但是因为有了空间复杂度的限制,所以改进方法,最简单的方法就是从数组的最后一个位置(numsSize)的元素开始,将nums[numsSize]拿出保存,其余元素向后移动
// 再将nums[numsSize]放到第一个位置,这样移动k次即可完成右旋k次;
//不过我们还有一种简化的做法,那就是先将前面的numsSize-k个元素倒置,再将后面的k个元素倒置,最后将整个数组倒置,这样也可以完成右旋k次,下面的代码就是按照这种方式完成的

#include<stdio.h> #include<stdlib.h> void swap(int* nums, int start, int end) { for (; start < end; start++, end--) { int temp = 0; temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; } } void removeDuplicates(int* nums, int numsSize, int k) { swap(nums, 0, numsSize - k - 1); swap(nums, numsSize - k, numsSize - 1); swap(nums, 0, numsSize - 1); } int main() { int num[] = { 1,2,3,4,5,6,7 }; int k = 3; removeDuplicates(num, sizeof(num) / sizeof(num[0]), k); for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++) { printf("%d\n", num[i]); } return 0; }