一个数组 A 中存在有 N(N>0) 个整数, 在不允许使用另外数组的前提下,将每个整数循环向右移M(M≥0) 个位置,即将 A 中的数据由 (A0A1⋅⋅⋅AN−1) 变换为 (AN−M⋅⋅⋅AN−1A0A1AN−M−1) (最后 M 个数循环移至最前面的 M 个位置) 如果需要考虑程序移动数据的次数尽量少, 要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例, 第1行输入 N(1≥N≤100) 和 M(M≥0); 第2行输入 N 个整数, 之间用空格分隔.
voidMove(int* p, int n){ int temp = p[n - 1]; for (int i = n - 1; i > 0; i--) p[i] = p[i - 1]; // 从后向前赋值, 有些类似于矩阵. 从后一行加到前一行 p[0] = temp; }
intmain(){ int n, m; cin >> n >> m; int* p = newint[n]; for (int i = 0; i < n; i++) cin >> p[i]; for (int i = 0; i < m; i++) Move(p, n); for (int i = 0; i < n - 1; i++) cout << p[i] << " "; cout << p[n - 1]; delete[] p; }
intmain(){ int n, m; cin >> n >> m; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; m %= n; // 这一部分是这段代码的核心, 需要好好研究. if (m != 0) { 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]; return0; }
intmain(){ int n, m, i; cin >> n >> m; int a[n]; for (i = 0; i < n; i++) cin >> a[i]; for (i = 0; i < n; i++) { int j = i - m % n; if (j < 0) cout << a[j + n]; else cout << a[j]; if (i < n - 1) cout << " "; } }