2017网易有道编程题:构造队列

原题如下:

            小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:

while(!Q.empty()) //队列不空,执行循环

{

int x=Q.front();            //取出当前队头的值x

Q.pop();                 //弹出当前队头

Q.push(x);               //把x放入队尾

x = Q.front();              //取出这时候队头的值

printf("%d\n",x);          //输出x

Q.pop();                 //弹出这时候的队头

}

做取出队头的值操作的时候,并不弹出当前队头。
小明同学发现,这段程序恰好按顺序输出了1,2,3,…,n。现在小明想让你构造出原始的队列,你能做到吗?[注:原题样例第三行5有错,应该为3,以下已修正]

输入描述:

第一行一个整数T(T ≤ 100)表示数据组数,每组数据输入一个数n(1 ≤ n ≤ 100000),输入的所有n之和不超过200000。

输出描述:

对于每组数据,输出一行,表示原始的队列。数字之间用一个空格隔开,不要在行末输出多余的空格.

输入例子:

4
1
2
3
10

输出例子:

1
2 1
2 1 3
8 1 6 2 10 3 7 4 9 5

// 思路:做这道题的时候,看一眼觉得太难,都意思都不太理解。现在静下来仔细想想,这道题是这个意思:
// 输入一个数n,则这个执行这个队列后输出1,2,3,4…n,现在要还原出原始的队列(即1-n构成,但是顺序不是这样的)
// 例如输入3,原始队列是2,1,3时,才能使得最后输出的是1,2,3
// 别人的思路:将顺序序列处理得出结果
// 比如1 2 3 4 5,先将5插入到3、4之间(隔1),得到1 2 3 5 4,再将4插入到2、3之间(隔2),
// 得到1 2 4 3 5,再将5插入到1、2之间(隔3),得到1 5 2 4 3,最后将3插入到1前面(隔4),
// 得到最终结果:3 1 5 2 4
// 从上面例子可看出,不断的将最后一个元素插入到前面,规律为相隔元素个数依次递增,上面是从1到4
// 理解下:原操作是每次循环将队首的元素放到队尾。第一次操作时有n个元素,则是隔n-1个数,将其移动,并出列一个数;
// 第二次有n-1个元素,则是隔n-2个数,将其移动,并出列一个数;
// ………….
// 倒数第二次()时有2个元素,则是隔1个数,将其移动,并出列一个数;
// 最后一个数,此操作之后没有任何变化,其出列后队列为空,完成。
// 所以还原操作,是从最后一步到第一步,将队尾元素移动到队首

程序实现如下:

import java.util.*;

public class Main{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
        int group = in.nextInt();
        for (int i = 0; i < group; i++)
        {
            int n = in.nextInt();
            DoConstruct(n);
        }   
        }

    }

        private static void DoConstruct(int n)
    {
        Vector<Integer> vc = new Vector<Integer>();
        for (int i = 1; i < n+1; i++)
        {
            vc.add(i);
        }

        for(int i=1; i<n; i++){
            int tmp = vc.lastElement();
            vc.insertElementAt(tmp, n-1-i);
            vc.remove(n);
        }

        System.out.print(vc.firstElement());
        for (int i = 1; i < n; i++)
        {
            System.out.print(" " + vc.elementAt(i));
        }
        System.out.println();

    }
}

总结:思路还是重要的,基础知识部分可以慢慢积累,比如数据结构的知识,不知道使用哪种数据结构都是要慢慢积累的。Eclipse使用的好处就是,不必去具体了解它的所有函数,使用的时候视具体情况去了解就可以。

加油吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值