小易有一个长度为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序列,以空格分割,行末无空格。
4 1 2 3 4
4 2 1 3
import sysnum =int(sys.stdin.readline())numbers =sys.stdin.readline().strip().split(" ")output =""flag =0i =num-1while i>=0:output+=numbers[i]+" "if i==0:flag=1i -=2j =0if flag ==1:j =1while j<num-1:output+=numbers[j]+" "j +=2print(output)# 找规律就行了,网易这套卷子三道编程题考查的不是编程能力,而是数学能力。# 本题AC通过,不需要复杂的数据结构或者算法。复杂度 O(n)
#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; }