【C&C++】1008 数组元素循环右移问题 (20 分)


我做了个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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值