//给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
//你可以使用空间复杂度为 O(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]
解法:
void reverse(int* nums, int left, int right);
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
// 1 2 3 4 5 6 7 8 9
// 5 4 3 2 1 9 8 7 6 左边numsSize - k个数倒置
// 6 7 8 9 1 2 3 4 5
reverse(nums,0, numsSize-k-1);
reverse(nums , numsSize - k, numsSize - 1);
reverse(nums, 0 , numsSize - 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--;
}
}//运行成功
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 4;
rotate(arr, sz, k);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}