2018网易校招笔试上机题之操作数列

时间限制:2秒
空间限制:32768K
小易有一个长度为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

输出例子1:
4 2 1 3

这个题一开始我的结题思路是不断把数据添加到list中,因为Collections提供了一个reverse(List list)可以对放入其中的list中的数据进行反序,但是照这个思路解了之后超时了
伤心!!!
估计后台的运行过滤一切用函数实现反序的做法,应该抛弃对这个数列进行反序的操作,这个题应该有规律好好想一想
就他给出的例子分析一下
当只有1的时候
结果是1
1 2 的时候
结果 21
1 2 3 的时候
结果在2 1 的结尾加 3 再反序 也就是
3 1 2
有点规律了
1 2 3 4的时候
结果在上一个结果 3 1 2 的末尾加4进行反序
4 2 1 3
好了 ,对比一下1 2 3 4
反序输出之后最先输出肯定是最后加进去的即 a[3],然后呢 输出a[1] a[1]和a[3]相差一个数据a[2],好好想一想再输入a[1]之后进行反转然后a[2]接在了a[0]后面 那a[1] 和 a[2]这个输入位置挨着的数肯定输出的时候不会挨着,继续,a[2]接入到a[0]后面之后再反转a[1]又回来了又到了队尾,再接a[3],再反转

看出规律没

输入时两个挨着的数据在输出的时候是隔着的,在前半段第一个是最后输入的数据,然后下一个数据是输入时与他隔着一个的数据
所以前半段数据是

for(int i = n-1;i>=0;i-=2)
{ 
   System.out.println(s[i]);
}
后半段
  for (int i = n % 2; i < n - 2; i += 2) {  // 后一半根据整数个数的奇偶
                                            // 分别从第二个或第一个数开始以2为步长递增
   System.out.print(nums[i] + " ");
 }
System.out.print(nums[n - 2]);  // 最后一个数

你可能感兴趣的:(2018网易校招笔试上机题之操作数列)