题解

难度:简单

知识点:数学逻辑

题目解析

题目的意思是将输入数组在空数组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;
}