新鲜出炉-网易内推编程题目之操作序列

来源:互联网 发布:微信怎么发淘宝联盟 编辑:程序博客网 时间:2024/05/19 04:26

2018年网易校招内推编程题目,博主刚刚在线答完,废话少说,文归正传。

题目描述:小易有一个长度为n的整数序列,a_1,.....,a_n。然后考虑在一个空序列b上进行n次以下操作:

1、将a_i放入b序列的末尾

2、逆置b序列

小易需要你计算输出操作n次之后的b序列。

输入描述:

输入包括两行,第一行包括一个整数n(2<=n<=2*10^5),即序列的长度。

第二行包括n个整数a_1(1<=a_i<=10^9),即序列a中的每个整数,以空格分割。

输出描述:

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

示例1

输入:

4

1 2 3 4

输出:

4 2 1 3


解题思维过程

(1)解答网易的编程题,读懂题目几乎就成功了一大半。所以,在草稿纸上动手画一遍示例的详细过程后,你就能发现以下规律:

①将数放入序列b分两种情况:第i次放入b序列的i为奇数,将a_i放入b序列的末尾;当i为偶数时,将a_i放入b序列的头部;

②输出b序列时,也要分两种情况:当n为奇数时,从序列b的头部开始到尾部依次输出;当n为偶数时,从序列b的尾部开始到头部依次输出

(2)确定存储序列b的数据结构。如果你对STL(标准模板库)的各个容器比较熟悉,马上就可以想到list容器或者deque容器。

(3)解决序列b输出时行末无空格。顺便提一句:由于博主对迭代器不熟悉,在这导致卡了半个小时呀!各位看代码时,格外注意一下解决方法。

下面贴出博主的C++代码:

// ManipulateSequence.cpp : 定义控制台应用程序的入口点。//网易编程题之操作序列#include "stdafx.h"#include<iostream>#include<list>using namespace std;void PrintInverseSequence(int arr[],int n)//打印逆序列b{list<int> sequenceb;for(int i=1;i<=n;i++){if(i%2==1)//奇数从链表头插入sequenceb.push_front(arr[i-1]);else//偶数从链表尾插入sequenceb.push_back(arr[i-1]);}if(n%2==1)//奇数从链表头开始遍历{int n1=sequenceb.back();//取出链表最后一个数据sequenceb.pop_back();list<int>::iterator it1=sequenceb.begin();for(;it1!=sequenceb.end();++it1)            cout<<*it1<<" ";cout<<n1;}else//偶数从链表尾开始遍历{int n2=sequenceb.front();//取出链表最前一个数据sequenceb.pop_front();list<int>::reverse_iterator it2=sequenceb.rbegin();for(;it2!=sequenceb.rend();++it2)            cout<<*it2<<" ";cout<<n2;  }}int _tmain(int argc, _TCHAR* argv[]){int n;    cin>>n;    int*arr=new int[n];    for(int i=0;i<n;i++)        cin>>arr[i];    PrintInverseSequence(arr,n);    delete [] arr;return 0;}