网易有道2017内推编程题:构造队列 [python]

'''
[编程题] 构造队列
时间限制:1秒
空间限制:32768K
小明同学把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。




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


输入例子1:
4
1
2
3
10


输出例子1:
1
2 1
2 1 3
8 1 6 2 10 3 7 4 9 5
'''



'''
解题思路:找规律
  我自己先按照题设手算了几组数据,然后又逆推了几组数据,找到了解这道题目的规律:
  对于任意n>1的数,我们先取出n放入列表一中,此时列表一为[n]。
  接着取出n-1,放入列表一的最前面,此时列表一为[n-1, n]
  然后pop出列表一最后的元素放入列表一的最前面,此时列表已为[n, n-1]
  继续取出n-2,放入列表一的最前面,此时列表一为[n-2, n, n-1]
  pop出列表一最后的元素放入列表一的最前面,此时列表已为[n-1, n-2, n]
  一直重复以上步骤直至取出1为止
  不过直接用list做效率低,我用的是deque数据类型,效率可以提高一个数量级,思路类似上面的描述
'''


'''
代码运行结果:
答案正确:恭喜!您提交的程序通过了所有的测试用例

'''


from collections import deque

T = int(input())

for x in range(T):
    n = int(input())
    if n != 1:
        array = deque([n])
        for i in range(n-1, 0, -1):
            d1 = array.popleft()
            array.append(i)
            array.append(d1)
        results = map(str, list(reversed(array)))
        print(' '.join(results))
    else:
        print(1)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值