首页 > 试题广场 >

操作序列

[编程题]操作序列
  • 热度指数:231 时间限制: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
用栈
发表于 2019-09-20 16:48:32 回复(0)
import sys
num =int(sys.stdin.readline())
numbers =sys.stdin.readline().strip().split(" ")
 
 
output =""
flag =0
i =num-1
while i>=0:
    output+=numbers[i]+" "
    if i==0:
        flag=1
    i -=2
     
 
j =0
if flag ==1:
    j =1
     
while j<num-1:
    output+=numbers[j]+" "
    j +=2
 
print(output)
# 找规律就行了,网易这套卷子三道编程题考查的不是编程能力,而是数学能力。
# 本题AC通过,不需要复杂的数据结构或者算法。复杂度 O(n)
 

编辑于 2019-08-02 21:41:38 回复(0)
#include<cstdio>
#include<vector>
using namespace std;
// 这个题考双向链表
// 定义一个方向,每次插入就在这个方向相反的方向插入链表节点
// 然后逆转这个方向

struct Node{
    int data;
    Node* prior;
    Node* next;
    Node(int d){
        data = d;
        prior = NULL;
        next = NULL;
    }
};

bool right_drct = true; // 开始这个链表的定义方向是正序向右的  那右边就是末尾
Node* left_ptr = NULL;
Node* right_ptr = NULL;


int main(){
    // 先处理输入输出
    int T;
    int data;
    scanf("%d", &T);
    while(T--){
        if((left_ptr == NULL) && (left_ptr == right_ptr)){ // 初始化
            scanf("%d", &data);
            Node* n = new Node(data);
            left_ptr = n;
            right_ptr = n;
        } else{
            scanf("%d", &data);
            Node* n = new Node(data);
            if(right_drct){
                // 在right_尾节点去插
                right_ptr -> next = n;
                n -> prior = right_ptr;
                right_ptr = right_ptr -> next;
            } else{
                left_ptr -> prior = n;
                n -> next = left_ptr;
                left_ptr = left_ptr -> prior;   
            }
        }
        right_drct = !right_drct;
    }
    // 输出
    Node* p;
    if(right_drct){
        p = left_ptr;
        while(p -> next != NULL){
            printf("%d ", p -> data);
            p = p -> next;
        }
        printf("%d", p -> data);
    } else{
        p = right_ptr;
        while(p -> prior != NULL){
            printf("%d ", p -> data);
            p = p -> prior;
        }
        printf("%d", p -> data);
    }

    return 0;
}
发表于 2019-08-02 12:48:08 回复(0)
操作过程中进行StringBuffer的reverse,通过只有40%。
从结果数字的规律入手,反倒可以成功。

前半部分从后向前输出,后半部分从前向后输出。注意奇偶的区分
发表于 2019-03-20 13:11:26 回复(0)