目录
1008 数组元素循环右移问题
输入格式:
输出格式:
输入样例:
输出样例:
代码长度限制
时间限制
内存限制
思路:
1.右移函数
1.2函数代码:
2.main函数中
2.2main函数代码:
完整代码:
时间复杂度:
总结:
题目的链接:
1008 数组元素循环右移问题
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
1.右移函数
我们可以写一个函数来进行循环右移问题:
假设长度为5,下标为:
0 1 2 3 4
将0右移的话,0就在最右边了,0后面的所有数字都要左移一位:
4 1 2 3 0
先将0交换过去之后,将4一直挪移到0左边:
1 4 2 3 0
---->
1 2 4 3 0
---->
1 2 3 4 0
OK,这样就进行了一次右移运算.
1.2函数代码:
int n,m; //n为长度,m为次数
int a[101]; //循环数组
void fun(){ //右移一位
swap(a[0],a[n-1]); //第一位和最后一位交换
for(int i=(n-1);i>=2;i--) //将原本的最后一位不断的挪移到原本的第一位旁边
swap(a[i],a[i-1]); //相邻的交换
}
2.main函数中
成功编写了一次右移循环,我们只需要进行m次这样的函数,就打成了题目要求,因为题目说了行末没有多余的空格,输出的时候要特判一下.
2.2main函数代码:
int main(){
cin>>n>>m; //输入长度和循环次数
for(int i=0;i<n;i++) //一次输入
cin>>a[i]; //输入n个数
for(int i=0;i<m;i++) //进行m次数组右移循环
fun(); //一次数组右移循环
for(int i=0;i<n;i++){ //输出
if(i!=(n-1)) //如果不是最后一个
cout<<a[i]<<" "; //输出空格
else //在行的末尾
cout<<a[i]; //不加空格
}
cout<<endl; //换行
return 0;
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
int n,m; //n为长度,m为次数
int a[101]; //循环数组
void fun(){ //右移一位
swap(a[0],a[n-1]); //第一位和最后一位交换
for(int i=(n-1);i>=2;i--) //将原本的最后一位不断的挪移到原本的第一位旁边
swap(a[i],a[i-1]); //相邻的交换
}
int main(){
cin>>n>>m; //输入长度和循环次数
for(int i=0;i<n;i++) //一次输入
cin>>a[i]; //输入n个数
for(int i=0;i<m;i++) //进行m次数组右移循环
fun(); //一次数组右移循环
for(int i=0;i<n;i++){ //输出
if(i!=(n-1)) //如果不是最后一个
cout<<a[i]<<" "; //输出空格
else //在行的末尾
cout<<a[i]; //不加空格
}
cout<<endl; //换行
return 0;
}
时间复杂度:
右移一位也就是说fun函数的时间复杂度为O(N);
我们是连续运行了m次fun函数右移一位,时间复杂度就是O(M)*O(N)=O(MN);
总结:
这道题考了学生们的函数书写,动笔计算,循环找规律的应用,用数组实现算是简单的了,后续我们会讲一道链表右移一位循环问题!
题目的链接:
PTA | 程序设计类实验辅助教学平台千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台https://pintia.cn/problem-sets/994805260223102976/exam/problems/994805316250615808