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

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 list = new LinkedList<> ();
			boolean lastIsEffective = ((n&0x01)==0)?false:true;//根据奇偶性来决定初始的第二个元素的插入位置
			list.add(array[0]);
			for(int i=1;i 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();
	}
}


你可能感兴趣的:(Java语言,算法)