题目分析:
warning:题干有两个易错的坑点:
(1) 注意数组中的下标是从0开始的。(解法一中涉及)
(2)想一想,如果逆序次数大与7该怎么办?如果题干用例为[-1],然后逆序2次该怎么办?(解法二中涉及)
此题本人用了两种解法,分享给大家:
1.直接一对一对的逆置(不过会超时)
我们先考虑一对数据的逆置。在数组中,访问数据的时候下标是从0开始的,最后一个数字的下标是numsSize-1,(这是需要注意到的,不要越了界),以第一组题干数据为例,7对应的下标为numsSize-1,那么6的下标是numsSize-2,我们的思路为:把6移到7的位置上,5移到6的位置上,以此类推,最后空出的数组下标为0的位置,我们放入7。然后题干要求的是3次逆序,那么直接while(k--)就ok了。
void rotate(int* nums, int numssize, int k)
{
while (k--)
{
int tmp = nums[numssize - 1];
for (int end = numssize - 2; end >= 0; end--)
{
nums[end + 1] = nums[end];
}
nums[0] = tmp;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 3;
rotate(arr, sz, k);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.三步逆序部分数组
以三次逆序为例
第一步:逆序后三个元素
{1,2,3,4,7,6,5}
第二步:逆序前面的元素
{4,3,2,1,7,6,5}
第三步:逆序整个数组
{5,6,7,1,2,3,4}
over!
void Reverse(int* nums, int left, int right)
{
while (left < right)
{
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
if (k >= numsSize)
k = k % numsSize;
Reverse(nums, numsSize - k, numsSize - 1);
Reverse(nums, 0, numsSize - k - 1);
Reverse(nums, 0, numsSize - 1);
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 3;
rotate(arr, sz, k);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}