题解
难度:简单
知识点:数学逻辑
题目解析
题目的意思是将输入数组在空数组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; }