Bha*_*rat 2 python algorithm queue stack data-structures
我有一个包含如下元素的队列:
1 None 2 3 None 4 5 6 7 None 8 9 10 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
这里没有做分隔符的工作,仅此而已.
现在我想打印输出如下:
8 9 10 11 12 13 14 15
4 5 6 7
2 3
1
Run Code Online (Sandbox Code Playgroud)
我能打印出这个输出:
15 14 13 12 11 10 9 8
7 6 5 4
3 2
1
Run Code Online (Sandbox Code Playgroud)
从右侧遍历队列.
这是代码:
length = len(sequenced_que)
for i in range(0, length):
temp = sequenced_que.pop()
if temp is None:
print()
else:
print(temp.data, end=" ")
8 9 10 11 12 13 14 15
4 5 6 7
2 3
1
Run Code Online (Sandbox Code Playgroud)
可以通过使用临时堆栈来实现上述期望的输出.我可以将元素推入堆栈,直到遇到None然后开始弹出它们.
但这需要额外的O(n)空间.
我只需要一个有效的算法而不是使用临时堆栈.您可以使用队列和列表的所有属性.
谢谢 :)
您可以使用itertools.groupby"拆分"所需元素的数组.
import itertools
data = [1, None, 2, 3, None, 4, 5, 6, 7, None, 8, 9, 10, 11, 12, 13, 14, 15]
# Break the array into subarrays at None
blocks = [list(v) for k, v in itertools.groupby(data, lambda e: e is None) if not k]
# Reverse the subarrays
blocks.reverse() # or as a new list: rev_blocks = blocks[::-1]
Run Code Online (Sandbox Code Playgroud)
经过以上所述,blocks等于[[8, 9, 10, 11, 12, 13, 14, 15], [4, 5, 6, 7], [2, 3], [1]].如果要以相同的格式打印这些子数组:
for arr in blocks:
print(*arr, sep=' ')
Run Code Online (Sandbox Code Playgroud)