首页 > 试题广场 >

操作序列

[编程题]操作序列
  • 热度指数:35578 时间限制: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个整数 ai (1 ≤ ai ≤ 10^9),即序列a中的每个整数,以空格分割。


输出描述:
在一行中输出操作 n 次之后的 b 序列,以空格分割,行末无空格。 
示例1

输入

4
1 2 3 4

输出

4 2 1 3
//规律题
//n = 1,b = 1    n = 1直接输出
//n = 2,b = 2,1
//n = 3,b = 3,1,2
//n = 4,b = 4,2,1,3
//n = 5,b = 5,3,1,2,4
//n = 6,b = 6,4,2,1,3,5
//由上述可推,当n 为奇数时,
//先从后向前输出奇数位置的数字,再从前向后输出偶数位置的数字  
//当n 为偶数时
//先从后向前输出偶数位置的数字,再从前向后输出奇数位置的数字

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class test4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int [] array = new int [n];
        for(int i = 0;i < n;i++){
            array[i] = scanner.nextInt();
        }
        if(n == 1){
            System.out.println(array[0]);
        }
        if(n % 2 == 0){
            for(int i = n-1;i >= 0;i -= 2){
                System.out.print(array[i] + " ");
            }
            for(int i = 0;i < n - 2;i += 2){
                System.out.print(array[i] + " ");
                
            }
            System.out.print(array[n-2]);
        }
        else { //n % 2 == 1
            for(int i = n-1;i >= 0;i -= 2){
                System.out.print(array[i] + " ");
            }
            for(int i = 1;i < n - 2;i += 2){
                System.out.print(array[i] + " ");
            }
            System.out.print(array[n-2]);
        }
    }

}

有评论讲我固定在了12345的顺序输入规律上面,其实不是的。
第二行的输入是随意的,该方法适用于所有随意数字的输入。
编辑于 2019-05-05 22:43:32 回复(11)
我的理解是从a数组第一个数开始 第奇数个放b最后面 第偶数个放b最前面 这样就不用逆序
然后如果n为偶数就正向输出 n为奇数就反向输出 用deque双向队列实现
#include<iostream>
#include<deque>
using namespace std;

const int maxn = 2 * 1e5 + 5;
int arr[maxn], n;
deque<int> dp;
int main(){
    cin>>n;
    for(int i=0;i<n;i++) scanf("%d", &arr[i]);
    for(int i=0;i<n;i++){
        if(i % 2 == 0) dp.push_back(arr[i]);
        else dp.push_front(arr[i]);
    }
    if(n % 2 == 1){
        deque<int> dp_rev(dp.rbegin(), dp.rend());
        dp = dp_rev;
    }
    for(int i = 0; i < dp.size(); i++){
        printf("%d", dp[i]);
        if(i != dp.size() - 1) printf(" ");
    }
    printf("\n");
    return 0;
}
编辑于 2019-03-01 21:22:48 回复(0)
#!/usr/bin/env python
#-*- coding:utf8 -*-
def findNum(nums, n):
    for i in range(n-1, -1, -2):
        print nums[i],
    if n&1 == 0:
        for i in range(0, n, 2):
            print nums[i],
    else:
        for i in range(1, n ,2):
            print nums[i],
 
if __name__ == '__main__':
    n = input()
    nums = map(int, raw_input().split())
    findNum(nums, n)

发表于 2017-08-14 14:47:12 回复(0)
//别被迷惑了,其实不需要逆序,直接从后向前间隔一个输出,然后没有输出的顺序输出即可
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    long long n;
    while(cin>>n)
    {

        vector<int> a(n);
        for(long long i=0;i<n;++i)
            cin>>a[i];
 
        if(n == 1)//只有一个的话直接输出就行,感谢"...石头..."的纠正.
        {
            cout<<a[0]<<endl;
            return 0;
        }
        
        if(n%2==0)//我这里区分了一下奇数和偶数,更好处理
        {
            for(long long i=n-1;i>=0;i-=2)
            {
                cout<<a[i]<<" ";
            }
            cout<<a[0];
            for(long long i=2;i<n-1;i+=2)
                cout<<" "<<a[i];
        }
        else
        {
            for(long long i=n-1;i>=0;i-=2)
            {
                cout<<a[i]<<" ";
            }
            cout<<a[1];
            for(long long i=3;i<n-1;i+=2)
                cout<<" "<<a[i];
        }
        cout<<endl;
    }
    return 0;
}

编辑于 2017-08-21 11:20:10 回复(13)
n = int(input())
arr = list(input().split())
print(' '.join(arr[-1::-2]), end=' ')
print(' '.join(arr[n%2::2]))

编辑于 2019-03-14 16:11:44 回复(2)
坑爹的规律题

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] nums = new int[n];
            for (int i = 0; i < n; i++) {
                nums[i] = in.nextInt();
            }
            for (int i = n - 1; i >= 0; i -= 2) {     // 前一半从最后一个数开始以2为步长递减
                System.out.print(nums[i] + " ");
            }
            for (int i = n % 2; i < n - 2; i += 2) {  // 后一半根据整数个数的奇偶,分别从第二个或第一个数开始以2为步长递增
                System.out.print(nums[i] + " ");
            }
            System.out.print(nums[n - 2]);  // 最后一个数
        }
    }
}

发表于 2017-08-13 10:20:53 回复(4)
var n = parseInt(readline()); 
var a = readline().split(" "); 
var b = new Array(n);
var k = 0;
for(var i=n-1;i>=0;i=i-2){
b[k]=a[i];
k++;
}
for(var i=(n%2);i<n-1;i=i+2){
b[k]=a[i];
k++;
}
print(b.join(" "));

发表于 2017-08-16 17:10:08 回复(1)
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    int n;
    cin>>n;
    vector<int> a;
    for(int i=0;i<n;i++){
        int temp;
        cin>>temp;
        a.push_back(temp);
    }
    for (int i=n-1;i>=0;i-=2)
        cout<<a[i]<<' ';
    for (int i=((n&1)==1? 1:0);i<n-2;i+=2)
        cout<<a[i]<<' ';
    cout<<a[n-2]<<endl;
    return 0;
}
编辑于 2017-08-13 20:51:45 回复(9)

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n, 0);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    vector<int> b(n, 0);
    int cnt = 0;
    for (int i = n-1; i >=0; i--) {
        if (cnt % 2 == 0) {
            b[cnt / 2] = a[i];
        } else {
            b[n - 1 - cnt/2] = a[i];
        }
        cnt++;
    }
    for (int bi : b) cout << bi << " ";
    cout << endl;
    return 0;
}

发表于 2019-03-16 22:00:44 回复(0)
linkList结构:既可以用来做栈、也可以用来做队列
一次往尾节点插入(队列),一次往头结点插入(栈)
如果是偶数,顺着输出;如果是奇数,逆着输出

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

public class CaoZuoXuLie {
	public static void main(String[] args) {
		// int n = 5;
		// int[] a = { 1, 2, 3, 4, 5 };
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] a = new int[n];
		for (int i = 0; i < n; i++) {
			a[i] = scanner.nextInt();
		}

		Iterator<Integer> iterator = solve(n, a);
		while (iterator.hasNext()) {
			System.out.print(iterator.next() + " ");
		}
		System.out.println();
	}

	public static Iterator<Integer> solve(int n, int[] a) {
		LinkedList<Integer> linkedList = new LinkedList<>();
		for (int i = 0; i < n; i++) {
			if ((i & 1) == 0) {
				linkedList.offer(a[i]);
			} else {
				linkedList.push(a[i]);
			}
		}
		if ((n & 1) == 0) {
			return linkedList.iterator();
		}
		return linkedList.descendingIterator();
	}
}


编辑于 2019-03-06 14:39:13 回复(0)
找到规律其实很简单,将原串填入新串,填入的规则是填第一个,再添倒数第一个,再添第二个,再添倒数第二个,因此用两个指针分别指向头尾,在两指针相遇前,头指针不断++,尾指针不断--,在头尾指针相同时,在while外面填入最后一个元素即可。
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<string>
usingnamespacestd;
intmain()
{
intnum;
while(cin >> num)
{
vector<int> v;
inttemp;
for(inti = 0; i < num; i++)
{
cin >> temp;
v.push_back(temp);
}
vector<int> res;
res.resize(num);
intleft = 0, right = num - 1;
inttemp_1 = num - 1;
while(left < right)
{
if(left != right)
{
res[left] = v[temp_1];
temp_1--;
left++;
}
if(left != right)
{
res[right] = v[temp_1];
temp_1--;
right--;
}
}
res[left] = v[0];
for(inti = 0; i < num; i++)
{
cout << res[i];
if(i!=num-1)
cout<<" ";
}
cout<<endl;
}
system("pause");
return0;
}
编辑于 2018-03-31 18:59:34 回复(0)
无需对序列进行翻转操作,直接利用双端队列进行求解,反转序列通过向队头或者队尾添加元素来代替
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Deque;
import java.util.ArrayDeque;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        String[] seq = br.readLine().trim().split(" ");
        // 创建一个双端队列,无需反转,根据操作次数的奇偶分别向对头和队尾添加元素
        Deque<String> deque = new ArrayDeque<>();
        for(int i = 0; i < n; i++){
            if(i % 2 == 0)
                deque.addFirst(seq[i]);
            else
                deque.addLast(seq[i]);
        }
        if(n % 2 == 0){
            // 偶数长度从后面出队
            while(!deque.isEmpty())
                System.out.print(deque.pollLast() + " ");
        }else{
            // 奇数长度从前面出队
            while(!deque.isEmpty())
                System.out.print(deque.pollFirst() + " ");
        }
    }
}


发表于 2021-02-15 21:43:06 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, j=0, k=0;
    cin>>n;
    int a[n/2], b[n/2];
    for(int i=0;i<n;i++){
        if(i&1)
            scanf("%d", &b[k++]);
        else
            scanf("%d", &a[j++]);
    }
    if(n==1)
        printf("%d\n", a[0]);
    else{
        if(n&1){
            for(int i=(n-1)/2;i>=0;i--)
                printf("%d ", a[i]);
            for(int i=0;i<n/2;i++){
                if(i==n/2-1)
                    printf("%d\n", b[i]);
                else
                    printf("%d", b[i]);
            }
        }else{
            for(int i=(n-1)/2;i>=0;i--)
                printf("%d ", b[i]);
            for(int i=0;i<=(n-1)/2;i++){
                if(i==(n-1)/2)
                    printf("%d\n", a[i]);
                else
                    printf("%d ", a[i]);
            }
        }
    }
    return 0;
}

发表于 2020-09-07 13:30:58 回复(0)
import java.util.Arrays;
import java.util.Scanner;

/**
 * @Date : @{DATE}
 * @Author : xiuc_shi
 **/
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.valueOf(in.nextLine());
        int[] a = Arrays.stream(in.nextLine().split(" ")).mapToInt(i -> Integer.valueOf(i)).toArray();
        for(int i = n - 1; i >= 0;i -= 2){
            System.out.print(a[i] + " ");
        }
        for(int i = (n % 2 == 0? 0 : 1) ; i < n - 1;i += 2){
            System.out.print(a[i] + " ");
        }
    }
}
发表于 2019-09-05 15:25:59 回复(0)
n = int(input())
a = list(map(int, input().strip().split()))
res = []
for digit in a[::-2]:
    res.append(digit)
begin = 1 if n & 1 else 0
for digit in a[begin::2]:
    res.append(digit)
print(" ".join(str(v) for v in res))

clean the code

n = int(input())
a = list(input().strip().split())
print(' '.join(a[::-2]) + ' ' + ' '.join([n & 1::2]))
编辑于 2019-08-06 21:35:40 回复(0)
比较输入和输出,发现规律。比如1234,依次将4321放入输出的list。
4_ _ _,  4__3, 42_3, 4213.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    long n;
    scanf("%ld", &n);
    vector<int> input_list;
    for (long i = 0; i < n; i++)
    {
        int temp;
        scanf("%d", &temp);
        input_list.push_back(temp);
    }

    vector<int> b_list (n,0);
    for (long i = 0; i < n/2.0; i++)
    {
        if(!input_list.empty())
        {
            b_list.at(i) = input_list.back();
            input_list.pop_back();
        }
        if(!input_list.empty() && (n - 1 - i) != i)
        {
            b_list.at(n - 1 - i) = input_list.back();
            input_list.pop_back();
        }
    }
    for (long i = 0; i < n - 1; i++)
    {
        printf("%d ", b_list.at(i));
    }
    printf("%d", b_list.at(n - 1));
}

发表于 2019-05-24 07:40:08 回复(0)
//有同学知道为什么我这个运行时间这么长吗?100多ms
//本题是有规律的,偶数个数时,如 6 4 2 1 3 5,奇数个数时,如7 5 3 1 2 4 6;
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    unsigned num;
    unsigned i;
    vector<unsigned> vec;
    //vector容器应事先预留确定的大小,因为当前vector容量达最大而又有新的数据插入时,重新复制数据将非常耗时!
    vec.reserve(2e5);
    cin >> num;
    vec.push_back(0);//调整下标,可以不补
    while (num--)
    {
        cin >> i;
        vec.push_back(i);
    }
    int sz = vec.size();
        //看评论区发现if-else结构可以简化为一个顺序结构,学习了!
    if (sz % 2==0)
    {
        for (int k = sz-1; k >= 1; k -= 2)
            cout << vec[k] << " ";
        for (int k = 2; k <= sz - 2; k += 2)
            cout << vec[k] << " ";
    }
    else
    {
        for (int k = sz-1; k >= 2; k -= 2)
            cout << vec[k] << " ";
        for (int k = 1; k <= sz - 2; k += 2)
            cout << vec[k] << " ";
    }
    cout << endl;
}

编辑于 2019-04-17 23:42:36 回复(0)
//首先这是一个规律题,他后面的n贼大,按他的思路走大概率超时
//规律如下 //0 //0 1  1 0 //1 0 2  2 0 1 //2 0 1 3  3 1 0 2 //3 1 0 2 4  4 2 0 1 3 //4 2 0 1 3 5  5 3 1 0 2 4 //5 3 1 0 2 4 6  6 4 2 0 1 3 5 #include<iostream> #include<vector> using namespace std; int main(){     int n, m;     while (cin >> n){         vector<int> a;         for (int i = 0; i < n; i++){             cin >> m;             a.push_back(m);         }         if (n == 1)             cout << a[0] << endl;         if (n % 2 == 1){             for (int i = n - 1; i >= 0; i-=2)                 cout << a[i] << " ";             for (int i = 1; i < n; i+=2)                 cout << a[i] << " ";         }         else{             for (int i = n - 1; i >= 1; i -= 2)                 cout << a[i] << " ";             for (int i = 0; i < n; i += 2)                 cout << a[i] << " ";         }     }     return 0; }

编辑于 2019-04-17 20:30:15 回复(0)

按照题目的意思可以这样写
使用一个LinkedList保存数据,按照顺序分别从后和从前插入数据,之后按照插入数据的总数量,从前或者从后遍历输出就行了。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner s= new Scanner(System.in);
        int len = s.nextInt();
        LinkedList<Integer> list = new LinkedList<Integer>();
        for(int i=0;i<len;){
            list.add(s.nextInt());
            i++;
            if(i<len){
                list.addFirst(s.nextInt());
                i++;
            }
        }
        s.close();
        Iterator itr;
        if(len%2==0) itr = list.iterator();
        else itr = list.descendingIterator();
        if(itr.hasNext())System.out.print(itr.next());
        while(itr.hasNext()){
            System.out.print(" "+itr.next());
        }
    }
}
编辑于 2019-03-22 20:41:19 回复(2)
import java.util.Scanner;

public class Main {
    //方法1:将所有数保存在一个数组中,根据数组的长度进行规律地输出
    /*public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int len = in.nextInt();
        
        int[] arr = new int[len];
        for(int i = 0; i < len; i++) {
            arr[i] = in.nextInt();
        }
        
        if(len%2 == 0) {
            for(int i = len-1; i >= 1; i = i-2) {
                System.out.print(arr[i]+" ");
            }
            for(int i = 0; i<= len-2; i = i+2) {
                System.out.print(arr[i]);
                if(i != len-2) {
                    System.out.print(" ");
                }
            }
        } else {
            for(int i = len-1; i >= 0; i = i-2) {
                System.out.print(arr[i]+" ");
            }
            for(int i = 1; i<= len-2; i = i+2) {
                System.out.print(arr[i]);
                if(i != len-2) {
                    System.out.print(" ");
                }
            }
            
        }
        
    }*/
    
    //方法2:将数组按照奇偶位置存放在两个数组中,再根据数组长度进行规律输出
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int len = in.nextInt();
        int[] one;
        int[] two;
        if(len%2 == 0) {
            one = new int[len/2];//奇数位置序列
            two = new int[len/2];//偶数位置序列
        } else {
            one = new int[len/2];
            two = new int[len/2+1];
        }
        
        int i = 0; int j =0;
        
        for(; len>0; len = len-2) {
            two[i++] = in.nextInt();
            if(len != 1) {
                one[j++] = in.nextInt();
            }
        }
        
        if(len%2 == 0) {
            inverseprint(one);
            System.out.print(" ");
            correctprint(two);
        } else {
            inverseprint(two);
            System.out.print(" ");
            correctprint(one);
        }
        
    }
    
    private static void inverseprint(int[] arr) {
        for(int i = arr.length-1; i>= 0; i--) {
            System.out.print(arr[i]);
            if(i != 0) {
                System.out.print(" ");
            }
        }
    }
    
    private static void correctprint(int[] arr) {
        for(int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if(i != arr.length-1) {
                System.out.print(" ");
            }
        }
    }
}

发表于 2019-03-22 16:45:35 回复(0)

热门推荐

通过挑战的用户

查看代码
操作序列