Python程序:按升序排列卡片以便揭示
假设我们有一组卡片,我们希望按升序排列这些卡片以便揭示。我们知道,卡片的揭示方式如下:1. 移去并揭示最上面的卡片,然后将下一张卡片移到背面。2. 重复步骤1,直到没有更多卡片。我们必须找到一种卡片排列方式,以便它们能够按升序揭示。
例如,如果输入是cards = [1, 2, 3, 4, 5, 6, 7, 8],则输出将是[1, 5, 2, 7, 3, 6, 4, 8],因为移去1并将5移到背面,当前情况为[2, 7, 3, 6, 4, 8, 5]。移去2并将7移到背面,当前情况为[3, 6, 4, 8, 5, 7]。移去3并将6移到背面,当前情况为[4, 8, 5, 7, 6]。移去4并将8移到背面,当前情况为[5, 7, 6, 8]。移去5并将7移到背面,当前情况为[6, 8, 7]。移去6并将8移到背面,当前情况为[7, 8]。移去7,只有一张卡片[8]。然后移去[8]
为了解决这个问题,我们将遵循以下步骤:
- 对卡片列表cards进行排序
- idx := 一个包含从0到cards长度的元素的列表
- order := 一个新列表
- q := 一个队列,并插入idx的元素
- 当q不为空时,执行以下操作:
- 从q的左侧删除元素并将其插入order
- 如果q不为空,则:
- ans := 创建一个与cards大小相同的列表,并用0填充
- 对于order中的每个元素i和cards中的每张卡片,执行以下操作:
- ans[i] := card
- 返回ans
让我们看下面的实现来更好地理解:
示例
from collections import deque class Solution: def solve(self, cards): cards.sort() idx=[i for i in range(len(cards))] order=[] q=deque(idx) while q: order.append(q.popleft()) if q: q.append(q.popleft()) ans=[0 for _ in cards] for i,card in zip(order,cards): ans[i]=card return ans ob = Solution() print(ob.solve([1, 2, 3, 4, 5, 6, 7, 8]))
输入
[1, 2, 3, 4, 5, 6, 7, 8]
输出
[1, 5, 2, 7, 3, 6, 4, 8]
广告