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]);
            }
        }
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
牛客279957775号:铁暗恋
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务