题意整理。

  • 从一队学生中,队头队尾交替抽取。

方法一(队列)

1.解题思路

  • 首先将所有的学生加入到双端队列。
  • 模拟队头队尾交替抽取的过程。

动图展示: alt

2.代码实现

import java.util.ArrayDeque;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        ArrayDeque deque = new ArrayDeque();

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String name = scanner.next();
            // 初始化队列中的数据
            deque.offerLast(name);
        }

        //只要队列大小大于2,不断从队头队尾打印学生名字
        while(deque.size()>=2){
            System.out.println(deque.pollFirst());
            System.out.println(deque.pollLast());
        }
        //如果队列中还有学生,则必定只有一个学生,直接打印其名字
        if(deque.size()>0){
            System.out.println(deque.pollFirst());
        }

    }

}

3.复杂度分析

  • 时间复杂度:假设学生数为n,总共有2n2*n次入队和出队操作,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外大小为n的双端队列,所以空间复杂度为O(n)O(n)