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;
}