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]

更新于:2020年10月5日

402 次浏览

开启您的职业生涯

完成课程后获得认证

开始学习
广告