其实轮转数组有更简单易懂的方法,就是以下两种方法
1.三段逆置法
先将前n-k项逆置,再将后k项逆置,最后再将整个数组逆置就可得到想要的效果
void reverse(int* arr, int left, int right) { while (left < right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; 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); }
2.三段拷贝法
与三段逆置法相似,三段拷贝法需要另开辟一个相同大小的数组,首先将后k个拷贝到新数组里,再将前n-k个拷贝到后面的位置里,最后再将新数组的值拷贝到旧数组
void rotate(int* nums, int numsSize, int k) { k%=numsSize; int nums1[numsSize]; memcpy(nums1,nums+numsSize-k,sizeof(int)*k); memcpy(nums1+k,nums,sizeof(int)*(numsSize-k)); memcpy(nums,nums1,sizeof(int)*(numsSize)); }
结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!