PAT (Basic Level) Practice (中文)-1008-数组元素循环右移问题 (20分)

发布时间:2021-10-28 22:20:02

题目链接
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A?0?? A?1?? ?A?N?1?? )变换为(A?N?M?? ?A?N?1?? A0?? A?1?? ?A?N?M?1?? )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6

输出样例:
5 6 1 2 3 4


第一遍(有BUG):


#include
using namespace std;
int main(){
int n,d;
cin>>n>>d;
int a[n];
for(int i=0;i>a[i];
if(d>=n) d=d%n;
for(int i=0;i
int t[2]={a[0],-1};
for(int j=0;j
int k=j+1;
if(j==n-1) k=0;
t[k%2]=a[k];
a[k]=t[(k+1)%2];
}
}
for(int i=0;i
cout< if(i!=n-1) cout<<" ";
}
}

不用新开数组的解决方案:

想法如上图所示。
交上去系统验证得到AC,但是发现其实有问题,在总数字数为奇数时,会出现末尾数字的丢失。例如:输入数据5 1 1 2 3 4 5的结果为4 1 2 3 4。原因在于最后一位数字的传输出错了,t0被重复使用了,而不是交替。


所以添加一小行代码在程序段中 ,修复上述BUG,得到最终版本:


#include
using namespace std;
int main(){
int n,d;
cin>>n>>d;
int a[n];
for(int i=0;i>a[i];
if(d>=n) d=d%n;
for(int i=0;i
int t[2]={a[0],-1};
for(int j=0;j
int k=j+1;
if(j==n-1){
k=0;
if(n%2==1){ //在这里加入一小段代码 是对奇数个数数列的末尾特殊处理
a[0]=t[0];
continue;
}
}
t[k%2]=a[k];
a[k]=t[(k+1)%2];
}
}
for(int i=0;i
cout< if(i!=n-1) cout<<" ";
}
}

相关文档

  • 怎样样自制鲫鱼饵料配方
  • 冲浪诀窍
  • spyder莫名其妙的出错:ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'
  • 科目二考试相关知识介绍
  • 三星s8前置摄像头模糊
  • 调业务系统的附件上传 , 附件中文名乱码
  • 数据一致性和隔离
  • 夏季蔬菜排毒好功效
  • 微信七年回顾:历经多少质疑和差评,才配拥有今天的强大
  • 童年『圣诞节』傻事
  • 谈礼貌作文
  • 关于写感恩的心作文
  • 保安班长的工作总结多篇
  • 海棠果果脯的做法
  • 林业局主任科员个人工作总结
  • 关于大明湖的作文推荐
  • 享福的心情日记
  • 必备教学计划模板汇总5篇
  • 三星s7edge顶部图标有个HD是什么意思
  • vi形象设计是什么意思
  • 如何申请留学签证_如何办理留学签证
  • 梦见很多大米什么预兆
  • 轻轻地诉说
  • 辞职信家庭原因怎么写
  • 关于婚礼主持词开场白集锦
  • 有关新学习计划3篇
  • 马尔可夫链-Chapman-Kolmogorov方程及其n步转移概率矩阵
  • 重阳节敬老院活动方案
  • 关于初一暑假语文作业及答案参考
  • C++11 enable_if 详解
  • 猜你喜欢

    电脑版