2010统考真题
设将n(n>1)个整数存放到一维数组R中,设计一个在时间和空间两个方面都尽量高效的算法。
将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,…Xn-1)变换为(Xp,Xp+1,…Xn-1,X0,X1,…Xp-1)。
// 设将n(n>1)个整数存放到一维数组R中,设计一个在时间和空间两个方面都尽量高效的算法。
// 将R中保存的序列循环左移p(0<p<n)个位置,
// 即将R中的数据由(X0,X1,...Xn-1)
// 变换为(Xp,Xp+1,...Xn-1,X0,X1,...Xp-1)
#include <stdio.h>
#define n 10
int* cycleLeftShiftList(int *R,int p) //*R: 一维数组 p: 循环左移的位置
{
if(NULL == R) return -1; //入参保护
static int newR[n]={0}; //返回静态局部变量地址
int i = 0;
for (i; i < n - p; i++) //把R[p]之后的元素按顺序放到newR数组里
{
newR[i] = R[i + p];
}
for (int j = 0; j < p; j++) //把R[p]之前的元素按顺序放到newR数组里
{
newR[i] = R[j];
i++;
}
return newR;
}
//验证
int main()
{
int R[n] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //原先的一维数组
int p = 3;
int *newR = cycleLeftShiftList(R,p);
//打印
for (int i = 0; i < n; i++)
{
printf("newR[%d] = %d\n", i, newR[i]);
}
}
//空间复杂度和时间复杂度都是n