PAT Basic 1008. 数组元素循环右移问题
PAT Basic 1008. 数组元素循环右移问题
1. 题目描述:
一个数组\(A\)中存有\(N\)(\(>0\))个整数,在不允许使用另外数组的前提下,将每个整数循环向右移\(M\)(\(≥0\))个位置,即将\(A\)中的数据由(\(A_0A_1⋯A_{N−1}\))变换为(\(A_{N−M}⋯A_{N−1}A_0A_1⋯A_{N−M−1}\))(最后\(M\)个数循环移至最前面的\(M\)个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
2. 输入格式:
每个输入包含一个测试用例,第1行输入\(N\)(\(1≤N≤100\))和\(M\)(\(≥0\));第2行输入\(N\)个整数,之间用空格分隔。
3. 输出格式:
在一行中输出循环右移\(M\)位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
4. 输入样例:
6 2
1 2 3 4 5 6
5. 输出样例:
5 6 1 2 3 4
6. 性能要求:
Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB
思路:
利用一个索引变量记录数组右移后的开头位置,然后进行输出,相当于一个头指针。
这里注意右移次数\(M\)可能大于数组长度,所以要做一个取余的操作。
看到大佬题解的另外一种思路是直接按照右移后的顺序将输入存入数组,代码比较简洁,参见:PAT-Basic-1008. 数组元素循环右移问题 – Lnyan's Blog (llonely.com)
My Code:
#include <stdio.h> // standard io func header
#include <stdlib.h> // malloc func header
int main(void)
{
int numLen = 0; // data length
int shift = 0;
int *numArray;
unsigned char myIndex = 0;
scanf("%d", &numLen);
scanf("%d", &shift);
numArray = (int *)malloc(sizeof(int) * numLen);
for(int i = 0; i < numLen; i++)
scanf("%d", &numArray[i]);
shift %= numLen; // use remainder to eliminate redundant shift
if(shift) myIndex = numLen - shift;
for(int i = 1; i <= numLen; i++)
{
printf("%d%c", numArray[myIndex++], (i!=numLen) ? ' ' : '\0');
if(myIndex == numLen) myIndex = 0;
}
free(numArray);
return 0;
}