首页 > 试题广场 >

操作序列

[编程题]操作序列
  • 热度指数:568 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易有一个长度为n的整数序列,a_1,...,a_n。然后考虑在一个空序列b上进行n次以下操作:
1、将a_i放入b序列的末尾
2、逆置b序列
小易需要你计算输出操作n次之后的b序列。

输入描述:
输入包括两行,第一行包括一个整数n(2 ≤ n ≤ 2*10^5),即序列的长度。
第二行包括n个整数a_i(1 ≤ a_i ≤ 10^9),即序列a中的每个整数,以空格分割。


输出描述:
在一行中输出操作n次之后的b序列,以空格分割,行末无空格。
示例1

输入

4
1 2 3 4

输出

4 2 1 3
#include <bits/stdc++.h> 
using namespace std;
 
intmain()
{
    long long n;
    cin >> n;
    vector<long long> res(n);
    vector<long long> result(n);
    bool flag = true;
    long long left = 0;
    long long right = n - 1;
    for(long long i = 0; i < n; ++i)
        cin >> res[i];
    for(long long i = n - 1; i >= 0; --i)
    {
        if(flag)
        {
            result[left++] = res[i];
            flag = false;
            continue;
        }
        else
        {
            result[right--] = res[i];
            flag = true;
        }
    }
    for(long long i = 0; i < n - 1; ++i)
        cout << result[i] << " ";
    cout << result[n-1] << endl;
    return 0;
}

编辑于 2018-08-08 09:03:25 回复(0)
一开始想的暴力破解,从2开始迭代是翻转n-1序列,然后在最开始加上n.结果超时,对了50%
然后找到规律,n为偶数,最后结果左边全是偶数递减右边奇数递增,n为奇数,最后结果左边奇数递减右边奇数递增:
#include<iostream>
#include<vector>
#include<algorithm>
usingnamespacestd;
intnum;
intmain() {
     
    cin >> num ;
    vector<int> a(num);
    for(inti = 0; i<num; i++) {
        cin >> a[i];
    }
    vector<int> b;
    if(num==1){
        cout<<1;
        return0;
    }
    if(num%2==0){
        for(inti=num;i>=2;i=i-2)
            b.push_back(a[i-1]);
        for(inti=1;i<=num-1;i=i+2)
            b.push_back(a[i-1]);
    }
    else{
        for(inti=num;i>=1;i=i-2)
            b.push_back(a[i-1]);
        for(inti=2;i<=num-1;i=i+2)
            b.push_back(a[i-1]);
    }
    for(inti = 0; i < num; i++) {
        cout << b[i] << " ";
    }
    return0;
}
最后结果运行时间: 171 ms 占用内存:6004K,也懒得优化了,就这样吧。
发表于 2018-07-18 21:02:07 回复(0)
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
int main(){
    int n=0;
    cin>>n;
    //vector<int> a(n,0);
    int a=0;
    deque<int> b1;
    deque<int> b2;
    for(int i=0;i<n;i++){
        cin>>a;
        if((i&1)==0){ //第偶数个
            b1.push_front(a);
            b2.push_back(a);
        }else{     //第奇数个
            b2.push_front(a);
            b1.push_back(a);
        }
    }
    if(((n-1)&1)==0){ //第偶数个
        for(auto x : b1){
            cout<<x<<" ";
        }
    }else{         //第奇数个
        for(auto x : b2){
            cout<<x<<" ";
        }
    }
    cout<<endl;
    return 0;
}

发表于 2019-08-03 00:17:48 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main(){
    int n;
    while(cin >> n){
        // 输入
        vector<int> v(n);
        for(int i = 0; i < n; i++){
            cin >> v[i];
        }
        // 最后一个放在最前面,倒数第二个放在最后面,倒数第三个放在第三前面,一前一后地放
        vector<int> v2(n);
        for(int i = 0, j = n - 1, k = n - 1; k >= 0; i++, j--){
            v2[i] = v[k];
            k--;
            if(k >= 0){
                v2[j] = v[k];
                k--;
            }
        }
        // 输出
        ostream_iterator<int> it(cout, " ");
        copy(v2.begin(), v2.end(), it);
        cout << endl;
    }
    return 0;
}
编辑于 2019-08-01 15:00:56 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i<n; i++){
        cin >> nums[i];
    }
    vector<int> res(n);
    int count = n - 1;
    int j = 0;
    for (int i = count; i >= count % 2; i -= 2){
        res[j++] = nums[i];
    }
    for (int i = (count + 1) % 2; j<n&&i <= count - 1; i += 2){
        res[j++] = nums[i];
    }
    for (int i = 0; i<n - 1; ++i){
        cout << res[i] << " ";
    }
    cout << res[n - 1];
}

发表于 2019-07-18 21:42:54 回复(0)
这道题用deque比较方便
#include <iostream>
#include <string>
#include <vector>
#include <deque>
usingnamespacestd;
 
int main()     
{
    intn;
    cin>>n;
    deque<int>res;
    vector<int>data;
    intm;
    while(cin>>m) 
    {
        data.push_back(m);
    }
    for(inti =0;i<n;i++)
    {
        if(n%2==0)
        {
            if(i%2==0)
            res.push_back(data[i]);
        else
            res.push_front(data[i]);
        }
        else{
            if(i%2==1)
            res.push_back(data[i]);
        else
            res.push_front(data[i]);
        }
    }
    for(inti =0;i<n;i++)
    {
        intresult = res.front();
        res.pop_front();
        cout<<result<<' ';
    }
         
    return0;
}
发表于 2018-08-10 23:59:47 回复(1)
#include <iostream>
#include <vector>
 
usingnamespacestd;
 
intmain()
{
    intn;
    intnums;
    vector<int> a;
    vector<int> b;
    cin >> n;
    while(n--)
    {
        inttemp;
        cin >> temp;
        a.push_back(temp);
 
    }
    nums = a.size();
    if(nums & 1)//奇数个数
    {
        intm = nums -1;
        intk = 1;
        for(inti = 0; i < nums ; ++i)
        {
            if(m >= 0)
            {
                b.push_back(a[m]);
                m -= 2;
            }
            else
            {
                b.push_back(a[k]);
                k += 2;
            }
        }
    }
    else//偶数个数
    {
        intm = nums -1;
        intk = 0;
        for(inti = 0; i < nums ; ++i)
        {
            if(m >= 0)
            {
                b.push_back(a[m]);
                m -= 2;
            }
            else
            {
                b.push_back(a[k]);
                k += 2;
            }
        }
    }
    for( auto x : b)
    {
        cout << x << ' ';
    }
 
    return0;
}
发表于 2018-08-04 18:09:11 回复(0)