1008 数组元素循环右移问题 (20)(20 分)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A~0~ A~1~……A~N-1~)变换为(A~N-M~ …… A~N-1~ A~0~ A~1~……A~N-M-1~)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
这个以我的习惯直接用栈 但是好像不用也行,我稍后会不用的发代码看看
循环主要在于标记 倒数第几位的数据然后从那个数据开始往后读到末尾然后从头开始读,读到标记位置之前的那个元素就OK。但是要考虑到空格问题。所以先上 stack 所完成的代码
#include<bits/stdc++.h>
using namespace std;
void solve() {
int *a;
int inp, mov, listend = -1; // 输入元素个数 倒数第几位 标记
cin >> inp >> mov; // 输入
a = new int[inp]; // 开空间
stack<int>ST; // 创建栈
mov %= inp; // mov 超过数组实际长度时候需要取模 来规定位置
for (int i = 0; i < inp; i++) // 输入循环
cin >> a[i]; // 输入
for (int i = inp - 1; mov + 1; mov + 1 ? ST.push(a[i]), i-- : 0) // 一边计数一边入栈,保存mov等于0时候的位置+1
listend = !mov-- ? 1 + i : listend;
for (int i = -1; i < listend || ST.size(); !ST.size() ? i++ : 0) // 输出 原理是栈优先输出 栈无元素则按数组输出。
if (ST.size())
cout << ST.top() << " ", ST.pop();
else
i == -1 ? i = 0 : 1, i != listend - 1 ? cout << a[i] << " " : cout << a[i];
}
int main() {
solve();
return 0;
}
明显是写复杂了!真的!然后脑子拧过来了 一看,发现是这样写才是很好的
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[101], inp, mov, listend = 0;
cin >> inp >> mov;
mov %= inp;
for (int i = 0; i < inp; cin >> a[i], mov %= inp, i++);
for (int i = inp - mov ; i<inp; i++)
cout << a[i] << " ";
for (int i = 0; i<inp - mov ; i++)
i == inp - mov - 1 ? cout << a[i] : cout << a[i] << " ";
return 0;
}