トピックコンテンツ
配列AにはN(> 0)の整数があります。他の配列は許可されていないという前提で、各整数をM(≥0)だけ右に循環的に移動します。つまり、Aのデータは(A0)から変更されます。 A1⋯AN-1)は(AN-M⋯AN-1 A0 A1⋯AN-M-1)に変換されます(最後のM個の数字は最初のM個の位置に循環的に移動します)。プログラムがデータを移動する回数をできるだけ少なくする必要がある場合、移動方法を設計するにはどうすればよいですか?
入力フォーマット:
各入力にはテストケースが含まれ、最初の行はN(1≤N≤100)およびM(≥0)を入力し、2番目の行はスペースで区切られたN個の整数を入力します。
出力フォーマット:
スペースで区切られた、1行にMビットだけ右にシフトされた整数のシーケンスを出力します。シーケンスの最後に余分なスペースがあってはなりません。
入力サンプル:
6 2
1 2 3 4 5 6
最後に空白行はありません
サンプル出力:
5 6 1 2 3 4
最後に空白行はありません
問題解決のアイデア
この種の問題には固定された解決策があります。つまり、m <nを保証することを前提として、ベクトルを使用して配列にアクセスします(ここでは、m = m%nのメソッドを使用して保証できます)。 a [n-1]、a [0] -a [m-1]、a [m-1] -a [n-1]これらの3つの段落では、逆関数を順番に使用しています(逆関数のパラメーターに注意してください)。それらの要素を逆にするために、左が閉じて右が開いています)。
詳細なコード
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++){
cin >> a[i];
}
m %= n;
reverse(begin(a), begin(a) + n);
reverse(begin(a), begin(a) + m);
reverse(begin(a) + m, begin(a) + n);
for (int i = 0; i < n - 1; i++)
cout << a[i] << " ";
cout << a[n - 1]; //解决pat考试中,输出的最后一个数字后不能有空格的问题
return 0;
}