操作序列
操作序列
http://www.nowcoder.com/questionTerminal/b53bda356a494154b6411d80380295f5
题解
难度:简单
知识点:数学逻辑
题目解析
题目的意思是将输入数组在空数组b上进行n次下面的操作:第i次操作时
1)将输入数组的第i个数字放到b的末尾
2)将b数组逆序
例子:输入数组为1234
| 操作次数 | b | 逆序后的b |
|---|---|---|
| 第1次 | 1 | 1 |
| 第2次 | 12 | 21 |
| 第3次 | 213 | 312 |
| 第4次 | 3124 | 4213 |
方法一:模拟操作
复杂度:时间复杂度为o(n),空间复杂度为o(n)
求逆序太繁琐,时间花费比较多,那么可以定义一个头尾都可以插入数据的双向deque来简化操作,观察上面的例子,第i个数字插入b的时候(1<=i<=n),i如果为偶数,则在b的最后面插入,i为奇数,则在b的开头插入。最后观察得到,如果n为奇数,那么从头到尾输出b即可,如果n为偶数,则从尾到头输出b
| 操作次数 | 按照方法一插入数据得到的结果b | 正确的结果 |
|---|---|---|
| 第1次 | 1 | 1 |
| 第2次 | 12 | 21 |
| 第3次 | 312 | 312 |
| 第4次 | 3124 | 4213 |
#include<iostream>
#include<deque>
using namespace std;
int main(){
int n,temp;
deque<int> dp;
cin>>n;
for(int i=1;i<=n;i++){
cin>>temp;
if(i % 2 == 0) dp.push_back(temp);
else dp.push_front(temp);
}
if(n%2==1)
{
for(int i = 0; i < dp.size(); i++){
cout<<dp[i];
if(i != dp.size() - 1) cout<<" ";}
}
else
{
for(int i =dp.size()-1; i >=0 ; i--){
cout<<dp[i];
if(i != 0) cout<<" ";}
}
return 0;
}方法二:找规律
复杂度:时间复杂度为o(n),空间复杂度为o(n)
当n为奇数时,先从后向前输出奇数位置的数字,再从前向后输出偶数位置的数字
当n为偶数时,先从后向前输出偶数位置的数字,再从前向后输出奇数位置的数字
using namespace std;
#include<iostream>
#include<vector>
int main() {
int n;
cin>>n;
vector<int> a(n+1,0);
for(int i = 1; i <= n; i++) cin>>a[i];
if(n % 2) {
for(int i = n; i >= 1; i -= 2) cout<<a[i]<<" ";
for(int i = 2; i <= n; i += 2) i == n - 1 ? cout<<a[i] : cout<<a[i]<<" ";
} else {
for(int i = n; i >= 1; i -= 2) cout<<a[i]<<" ";
for(int i = 1; i <= n; i += 2) i == n - 1 ? cout<<a[i] : cout<<a[i]<<" ";
}
return 0;
}