构造队列-网易有道2017年内推编程题

来源:互联网 发布:按摩垫推荐 知乎 编辑:程序博客网 时间:2024/06/04 19:04

小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:
while(!Q.empty()) //队列不空,执行循环

{

int x=Q.front();            //取出当前队头的值xQ.pop();                 //弹出当前队头Q.push(x);               //把x放入队尾x = Q.front();              //取出这时候队头的值printf("%d\n",x);          //输出xQ.pop();                 //弹出这时候的队头

}

做取出队头的值操作的时候,并不弹出当前队头。
小明同学发现,这段程序恰好按顺序输出了1,2,3,…,n。现在小明想让你构造出原始的队列,你能做到吗?[注:原题样例第三行5有错,应该为3,以下已修正]
分析:在这里可以逆向来考虑,从n开始每次在数组中的首位置增加一个元素,然后将最后面的元素移动到数组的首位置,依次下去,当把1放置完成后就得到了原来的队列序列。

import java.util.ArrayList;import java.util.Scanner;/** * Created by Administrator on 2016/8/18. */public class Main{    public static void main(String[]args)    {        Scanner s=new Scanner(System.in);        int T=s.nextInt();        for (int i = 0; i <T ; i++)        {            int n=s.nextInt();            ArrayList<Integer>list=new ArrayList<>();            int num=n;            while (num!=0)            {                list.add(0,num);                int e= list.remove(list.size()-1);                list.add(0,e);                num--;            }            if (n>0)            {                for (int j = 0; j <n-1 ; j++)                {                    System.out.print(list.get(j)+" ");                }                System.out.println(list.get(n-1));            }        }        s.close();    }}
1 0