一個數組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
這道題的問題在於這似乎是一道數據結構的題目……但是評分標準裏沒有要求。
先考慮了兩個數組……後來發現,可以直接輸出所需的數組。從原數組的N-M項開始輸出就好。
以下是自己第一次做的時候用的方法。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int N,M;
int i;
int k=0;
cin>>N>>M;
vector<int>num(N);
vector<int>result(N);
if(M>=N){
M = M % N;
}
for(i=0;i<N;i++){
cin>>num.at(i);
}
//cout<<num.at(2);
for(i=N-M;i<N;i++){
result.at(k)=num.at(i);
k++;
}
for(i=0;i<N-M;i++){
result.at(k)=num.at(i);
k++;
}
for(i=0;i<N-1;i++){
cout<<result.at(i)<<" ";
}
cout<<result.at(i)<<endl;
return 0;
}