首页 > 试题广场 >

操作序列

[编程题]操作序列
  • 热度指数:3689 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易有一个长度为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 1 3

找规律

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        if (n % 2 == 0) {
            for (int i = n - 1; i >= 0; i -= 2) {
                System.out.print(arr[i] + " ");
            }
            for (int i = 0; i < n; i += 2) {
                System.out.print(arr[i] + " ");
            }
        } else {
            for (int i = n - 1; i >= 0; i -= 2) {
                System.out.print(arr[i] + " ");
            }
            for (int i = 1; i < n - 1; i += 2) {
                System.out.print(arr[i] + " ");
            }
        }
    }
}
发表于 2019-07-28 09:40:27 回复(0)
暴力破解是不行的,用双向队列头尾插入,当长度n是偶数就要反转,否则不用
如果自己实现的双向链表,可以只换一下头尾指针即可,更快

import java.util.*;
public class Main{
    public static void operate1(long[] arr) {
        if (arr == null) {             return;         }
        LinkedList<Long> listB = new LinkedList<>();
        for (int i=0; i < arr.length; i++) {
            if (i % 2==0) {    // 偶数尾插入
                listB.addLast(arr[i]);
            } else {    // 奇数头插入
                listB.addFirst(arr[i]);
            }
        }
        if (arr.length % 2 == 1) {
            Collections.reverse(listB);
        }
        
        for (Long l : listB) {
            System.out.print(l + " ");
        }
    }
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int len = in.nextInt();
        long[] arr = new long[len];
        for (int i=0; i < len; i++) {
            arr[i] = in.nextLong();
        }
        operate1(arr);
    }
}

发表于 2019-03-12 23:10:04 回复(0)
let n = parseInt(readline());
let line = readline().split(" ");
let arr = new Array();
for(let i = 0; i < n; i++){
    arr[i] = parseInt(line[i]);
}
let b = new Array(n);
let flag = true;
let start = 0, end = n-1;
let p = start;
for(let i = n-1; i >= 0; i--){
    if(flag){
        p = start;
        start++;
        flag = false;
    }else{
        p = end;
        end--;
        flag = true;
    }
    b[p] = arr[i];
}
let str = "";
for(let i = 0; i < n-1; i++){
    str+=b[i];
    str+=" ";
}
str+=b[n-1];
print(str);

发表于 2018-08-30 15:43:54 回复(0)
先倒着存,然后顺着存,区分长度为奇数还是偶数;
#include<bits/stdc++.h>

using namespace std;



//
int main()
{
    int N;
    cin>>N;
    vector<int>nums;
    vector<int>res;
    bool xq=true;
    int j=N-1;
    for(int i=0;i<N;i++)
    {
        int tmp;
        cin>>tmp;
        nums.push_back(tmp);
    }
    
    while(res.size()<N&&j>=0)
    {
        res.push_back(nums[j]);
        j-=2;
    }
    
    if(j==-1)  //偶数   奇数和偶数顺着存的开始位置不一样
    {
        j=0;
    }
    else if(j==-2) //奇数 
    {
        j=1;    
    }
    
    while(res.size()<N&&j<N)
    {
        res.push_back(nums[j]);
        j+=2;
    }
    
    
    for(int num:res)
    {
    cout<<num<<" ";    
    }
    return 0;
}


发表于 2022-07-05 09:54:55 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int len = scan.nextInt();
        int[] arr = new int[len];
        int[] n = new int[len];
        for(int i = 0 ; i< len;i++){
            arr[i] = scan.nextInt();
        }
        for(int i = 0;i<len/2;i++){
                n[i] = arr[len-2*i-1];
                n[len-i-1] = arr[len-2*i-2];
        }
        if(len%2!=0){
            n[len/2] = arr[0];
        }
        for(int i : n){
            System.out.print(i+" ");
        }
    }
}
发表于 2018-09-04 14:23:18 回复(0)

问题信息

上传者:小小
难度:
5条回答 2209浏览

热门推荐

通过挑战的用户

操作序列