我做了个pta乙级题解的专栏,欢迎来专栏看~
C 20’/20’ 方法较繁
建立了循环单链表来解决该问题。该方法挺麻烦的,我下面有用C++做这题,用的另建数组的方法,“另建数组”比较简单。
注意M>N时,要特殊处理。
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}linklist; //循环单链表
linklist *head, *p;
void CREATELIST(int N) //创建循环单链表
{
int i = 0;
DataType x;
head = (linklist *)malloc(sizeof(linklist));
p = head;
scanf("%d",&x);
for(i = 0; i < N - 1; i++) //最后一个node特殊处理,所以这里i!=N-1
{
p->data = x;
p->next = (linklist *)malloc(sizeof(linklist));
p = p->next;
scanf("%d",&x);
}
//处理最后一个node
p->next = head;
p->data = x;
}
linklist *GET(int M, int N)
{
int k = 1;
linklist *r;
r = head;
if(M > N)
{
M = M % N;
}
if(M == 0)
{
return head;
}
else if(M >= 1)
{
while(k < N - M +1)
{
r = r->next;
k++;
}
}
return r;
}
void PRINTLIST()
{
int k = 0;
linklist *end;
end = p;
while(p != end || k == 0) //k==0:第一次一定能进来
{
if(k != 0)
{
printf(" ");
}
printf("%d",p->data);
p = p->next;
k++;
}
}
int main()
{
int N, M;
scanf("%d %d",&N, &M);
CREATELIST(N);
p = GET(M, N);
PRINTLIST();
return 0;
}
C++ 20’/20’用了“另建数组”方法,20min搞定
当初被题干里“在不允许使用另外数组的前提下”这句话给唬到了,以为真的得这么做,于是第一次做的时候(用C做的那一次)用了链表。
这一次做的时候,想着,它测试我代码应该是只测试结果是否正确,以及细节地方能否考虑到(关于细节,下面就会讲到),于是用了另外的数组,用来存放后面的M个数字。
关于细节:M可能 > N,所以要做如下处理:
M = M % N;
#include <iostream>
#include <array>
using namespace std;
const size_t arraySize = 100;
array<int, arraySize> ns = {}; // 原始的输入的n个数字
array<int, arraySize> latterm = {}; // 先存放后M个数
int t = 0; // latterm的下标
int main()
{
int N;
int M; // M可能大于N
cin >> N >> M;
M = M % N;
for (int i = 0; i < N; i++)
{
cin >> ns[i];
}
// 存放后M个数,即 截取ns组的后M个数到latterm前面
// 从ns组中下标为N-M的数开始存放到latterm中
for (int i = N - M; i < N; i++)
{
latterm[t++] = ns[i];
}
// 将ns剩下的前半部分放到latterm中
for (int i = 0; i <= N - M - 1; i++)
{
latterm[t++] = ns[i];
}
for (int i = 0; i < N; i++)
{
if (i)
{
cout << " ";
}
cout << latterm[i];
}
return 0;
}