1.相似题目
此题与 字符串左旋相似,点击查看呦!
2.题目
2.1法一:循环前移法
每次旋转1个,旋转k次
时间复杂度:O(N^2)
空间复杂度:O(1)
2.2法二:部分前移法
时间复杂度:O(N)
空间复杂度:O(N)
2.3法三:三次逆置法
前n-k个逆置
后k个逆置
整体逆置
时间复杂度:O(N)
空间复杂度:O(1)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void reverse(int* a, int left, int right)
{
assert(a);
while (left < right)
{
int tmp = a[left];
a[left] = a[right];
a[right] = tmp;
left++;
right--;
}
}
void rotate(int* a, int n, int k)
{
assert(a);
k %= n;
reverse(a, n - k, n - 1);
reverse(a, 0, n - k - 1);
reverse(a, 0, n - 1);
}
int main()
{
int a[5] = { 1,2,3,4,5 };
int k = 2;
for (int i = 0; i < 5; i++)
{
printf("%d ", *(a + i));
}
rotate(a, 5, k);
printf("\n");
for (int i = 0; i < 5; i++)
{
printf("%d ", *(a + i));
}
return 0;
}