PTA乙级1008(数组元素循环右移)
- 首先刚看到这个题我想到的位置之间的关系(i+M)%n,然后我就直接将a[(i+M)%n]=a[i];这样就会出现数字覆盖的问题;然后我就想如何去解决,结果大脑就陷入死机状态,其实完全可以直接输出a[(i+M)%n](扎心)
- 方法一:可以直接输出,但要注意空格的问题(代码如下)
···
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
int n,M; cin>>n>>M;
int a[n+1];
M=M%n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=n-M;i<n;i++)
{
cout<<a[i];
if(M!=n && i!=n )cout<<" " ;
if(M==n && i!=(n-1)) cout<<" ";
}
for(int i=0;i<n-M;i++)
{
cout<<a[i];
if(M!=0 && i!=(n-M-1)) cout<<" ";
if(M==0 && i!=(n-M-1)) cout<<" ";
}
}
···
一开始我忽略了M可以大于N的问题(只有14分,嘤嘤嘤),然后就有了开始的M=M%n(棒棒哒)
- 方法二: 只需将原数组反转,然后在进行M反转,n-M反转
int main()
{
freopen("in.txt","r",stdin);
int n,M; cin>>n>>M;
int a[n+1];
M=M%n;
for(int i=0;i<n;i++) cin>>a[i];
reverse(a,a+n);
reverse(a,a+M);
reverse(a+M,a+n);
for(int i=0;i<n;i++)
{
cout<<a[i];
if(i!=n-1) cout<<" ";
}
}
注意:reverse()反转左闭右开的区间,元素的起始位置和终止位置;同样要考虑M>n的问题;