网易2018内推Java开发工程师笔试题----操作序列

来源:互联网 发布:数学建模与算法的关系 编辑:程序博客网 时间:2024/06/05 06:20

1.题目

小易有一个长度为n的整数序列,a_1,...,a_n。然后考虑在一个空序列b上进行n次以下操作:
1、将a_i放入b序列的末尾
2、逆置b序列
小易需要你计算输出操作n次之后的b序列。

2.基本解题思路

网上大神的解决思路是:

个数是奇数的时候:奇数放在左边,偶数放在右边 
个数是偶数的时候:偶数放在左边,奇数放在右边

为什么形成这样的解题思路呢?

以1,2,3,4...n为输入来进行分析:1具备特殊性,从2开始分析

1)B初始在末尾加入2后,还需要经历n-1次逆转,若n为偶数,则2会跑到初始加入时的对头位置(前面);若n为奇数,则2会保持在初始加入时的位置(后面)

2)B初始在末尾加入3后,还需要经历n-2次逆转,若n为偶数,则3会保持在初始加入时的位置(后面);若n为奇数,则3会跑到初始加入时的对头位置

3)...

故每个元素在加入B后进行多次变换的最终位置可以确定,且相邻两个元素的加入一定是一个在对头一个在对尾,故主张使用双端队列来进行模拟。网上也有很多找到了跟位置的更特殊的解题方法,但是本博客中的这种是比较贴合题目来进行理解,其他解法则要进一步总结元素和位置的关系。

3. 代码

import java.util.Iterator;import java.util.LinkedList;import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {int n = scanner.nextInt();int[] array = new int[n];for(int i=0;i<n;i++)array[i] = scanner.nextInt();LinkedList<Integer> list = new LinkedList<> ();boolean lastIsEffective = ((n&0x01)==0)?false:true;//根据奇偶性来决定初始的第二个元素的插入位置list.add(array[0]);for(int i=1;i<n;i++) {if(lastIsEffective) list.addLast(array[i]);else list.addFirst(array[i]);lastIsEffective = !lastIsEffective;//相邻元素逆转插入位置}Iterator<Integer> iterator = list.iterator();.//下面是打印队列元素boolean isFirst = true;while(iterator.hasNext()) {if(!isFirst) System.out.print(" ");System.out.print(iterator.next());isFirst = false;}System.out.println();}scanner.close();}}