题面:
一个数组A中有N(1 <= N <= 100)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移动M(M ≥ 0)个位置.
思路:
循环向左移动M个位置意味着把前M个元素按原来的顺序累积在最后.我们可以用双端队列轻松地解决这道题目。
参考代码:
#include <bits/stdc++.h>
#define i64 long long
template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
f *= fu;
}
int main() {
int n, m;
read(n), read(m);
std::vector<int> a(n);
std::deque<int> dq;
for (int i = 0; i < n; i++) {
read(a[i]);
dq.push_back(a[i]);
//将元素放在队列里面
}
for (int i = 0; i < m; i++) {
int x = dq.front();
//取出最左端的元素,堆在最后面
dq.pop_front();
dq.push_back(x);
}
while (dq.size()) {
printf("%d%s", dq.front(), (dq.size() == 1 ? "\n" : " "));
dq.pop_front();
}
return 0;
}