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

来源:互联网 发布:足彩大数据分析哪里看 编辑:程序博客网 时间:2024/06/04 19:19
'''
[编程题] 构造队列
时间限制: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 dequeT = 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)


原创粉丝点击