题目描述:
给你一个数组,将数组中的元素向右轮转K个位置,其中K是非负数,然后返回新数组
示例:
输入:[1,2,3,4,5,6,7],k=3;
输出:[5,6,7,1,2,3,4]
方法一:使用额外的数组,申请一个和原数组长度等同的数组来把每个元素放到正确的位置上。
先把原数组的最后k个值放到新数组的前k个位置,再把原数组剩下的元素依次放在后面。
void rotate(int* nums, int numsSize, int k)
{
int* new_nums = (int*)malloc(sizeof(int) * numsSize);
for (int i = 0; i < numsSize; i++)
{
new_nums[(i + k) % numsSize] = nums[i];
}
for (int i = 0; i < numsSize; i++)
{
nums[i] = new_nums[i];
}
free(new_nums);
方法二:数组翻转
由于我们将数组的元素向右移动k次后,尾部k个元素会移动到数组的头部,其余元素将向后k个位置。因此,我们可以先把所有的元素翻转,这样尾部k个元素就被移动到数组头部,然后我们再把前k个元素和其余的元素翻转就可以得到最后的答案。
示例:
原始数组: 1 2 3 4 5 6 7
翻转所有元素: 7 6 5 4 3 2 1
翻转前k个元素 : 5 6 7 4 3 2 1
再翻转剩下的元素 : 5 6 7 1 2 3 4
void Swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void Reverse(int* nums, int start, int end)
{
while (start < end)
{
Swap(&nums[start], &nums[end]);
start += 1;
end -= 1;
}
}
void rotate2(int* nums, int numsSize, int k)
{
k %= numsSize;
Reverse(nums, 0, numsSize - 1);
Reverse(nums, 0, k - 1);
Reverse(nums, k, numsSize - 1);
}