WY37 - 操作序列 - 网易
(java实现)
题目描述:
小易有一个长度为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
输出
4 2 13
问题分析:
思路一:若使用暴力法,即每输入一次,就调整一次;这样思路是挺简单的,但是会带来一个问题,一旦数据量很大的时候,这个调整的时间就会大大的增加,容易超时。
思路二:寻找规律:
n = 1; a = 1; b = 1 n = 1直接输出 n = 2; a = 1,2; b = 2,1 n = 3; a = 1,2,3; b = 3,1,2 n = 4; a = 1,2,3,4; b = 4,2,1,3 n = 5; a = 1,2,3,4,5; b = 5,3,1,2,4 n = 6; a = 1,2,3,4,5,6; b = 6,4,2,1,3,5
由上述可推:
当n为奇数时,先从后向前输出奇数位置的数字,再从前向后输出偶数位置的数字;
当n为偶数时,先从后向前输出偶数位置的数字,再从前向后输出奇数位置的数字;
总结:第一,直接从末尾往前输出,间隔为2;第二前面往后输出,间隔为2;
注意:由于输出的要求,只能是每个数字之间留有空格。(这时需要单独输出第一个,或者是最后一个)
相关知识:
略
参考代码:
思路一实现:
略(提交的暴力法的代码,当时未保存在本地。平台上估计是为了减少存储,好像只保留最新的一次提交的代码)
思路二实现:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNextInt()) { int n = input.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = input.nextInt(); } System.out.print(nums[n-1]); // 第一个数 for (int i=n-3; i>=0; i-=2) { // 前一半从最后一个数开始以2为步长递减 System.out.print(" " + nums[i]); } for (int i=n%2; i<n; i+=2) { // 后一半根据整数个数的奇偶,分别从第二个或第一个数开始以2为步长递增 System.out.print(" " + nums[i]); } } } }