PTA 数组循环左移【C语言版本】内含两种方法与测试点提示 第二种超级简单!!!(小白也能理解欧)

这道题目是学习数据结构前期的一道题目,我们学的数据结构(C语言版)第一章就是链表和线性表,所以,搜索这道题的人应该是初学者,对于学过的人再回头看应该觉得特别简单,但是初学者来说就特别不容易理解,所以博主贴心的准备了第二种方法,你,一定可以学会!!!

题目

在这里插入图片描述

输入格式

输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式

在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例

8 3
1 2 3 4 5 6 7 8

输出样例

4 5 6 7 8 1 2 3

题目分析

对于这道题目
一般的思路就是创建一个稍微大一点的数组,然后再进行数据移动:
比如说 给定6个数字,创建a【7】,让a【0】轮空,什么都不存,数据从a【1】开始存,然后把a[1] 存入a[0],后面的数据整体往前挪一个位置,将a[0]的数据存在最后一个位置,这样循环m(m代表需要循环左移m个位置)次,就可以得到想要的答案了
当然,在处理的时候,应该先处理一下m和n的大小关系,当m大于n时,让m=m%n,减少没有意义的移动次数
当然,除了后插法,也可以使用前插法:
让最后一个数据插到a[0],再循环后移,这样移动n-m次就可以了
其实可以两种方法结合,当m<=n/2使用后插,m>n时使用前插法,减少移动次数
这就是法一,博主做题没有使用这种方法,不知道是不是能通过所有的测试点
接下来就是重头戏了,当当当!!!

法二

对于这道题,其实我们可以偷偷使用一个数组存起来,也就是多使用一个数组。虽然题目不允许,但是博主记得用了也可以通过所有的测试点
值得注意的时 不要使用链表博主当时用的链表结果没有通过所有的测试点,可能时博主当时写的有些错误,不过这些都不重要
我们可以按照输入顺序存储,但是输出用点儿小办法
我们可以输出时先打印需要开始的数字,打印完再打印最开始的数据

就拿题目来说
输入 1 2 3 4 5 6 7 8
m=3
我们先打印4 5 6 7 8
然后打印1 2 3
这样不用挪数组,就可以得到答案
博主亲测,可以拿满分!!!!

法二代码

其实聪明的你一定也会写,不过按惯例,博主再提供一下:

#include <stdio.h>
int main(){
int x,y,i,k;
int a[100];
scanf("%d",&x);
scanf("%d",&y);
y=y%x;
for(i=0;i<x;i++){
    scanf("%d",&a[i]);
}
for(k=y;k<x;k++){
    if(k==y)
    printf("%d",a[k]);
    else{
    printf(" %d",a[k]);
    }
}
for(k=0;k<y;k++)
    printf(" %d",a[k]);
}

给大家看一下提交结果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值