C++ 中按升序揭示卡片


假设我们有一副扑克牌;每张牌都有一个唯一的数字。我们可以按任何我们想要的顺序排列这副牌。所以最初,所有牌都正面朝下(未揭示)放在一副牌中。现在,我们多次执行以下步骤,直到所有牌都揭示出来:

  • 假设我们有一副扑克牌;每张牌都有一个唯一的数字。我们可以按任何我们想要的顺序排列这副牌。所以最初,所有牌都正面朝下(未揭示)放在一副牌中。现在,我们多次执行以下步骤,直到所有牌都揭示出来:

  • 如果牌堆中还有牌,则将牌堆顶部的下一张牌放到牌堆的底部。

  • 如果还有未查看的牌,则返回步骤 1。否则,停止此过程。

因此,我们必须返回牌堆的一个排序,该排序将按升序揭示牌。

现在,答案中的第一个条目被认为是牌堆的顶部。

所以如果输入类似于 [17,13,11,2,3,5,7],那么输出将是 [2,13,3,11,5,17,7],假设我们将其重新排序为 [2,13,3,11,5,17,7],现在 2 在顶部,在看到 2 后,将 13 移到最后,所以牌堆将类似于 [3,11,5,17,7,13],然后移除 3,并再次执行此步骤。所以牌堆将是 [5,17,7,13,11],之后移除 5,然后在将顶部移到底部后,数组将是 [7,13,11,17],然后通过执行相同的操作,牌堆结构将是 [11,17,13],[13.17],[17],然后删除 17。

为了解决这个问题,我们将遵循以下步骤:

  • 首先对牌堆进行排序,设置 n := 牌堆的大小

  • 定义一个队列 q,以及一个名为 ans 的大小为 n 的数组

  • 将连续的 i 个元素插入 q 中,其中 i 的范围是从 0 到 n – 1

  • 对于 i 的范围从 0 到 n – 1

    • x := q 的首元素,然后从队列中删除

    • ans[x] := deck[i]

    • x := q 的首元素,然后从队列中删除

    • 将 x 插入 q 中

  • 返回 ans

让我们看看以下实现以获得更好的理解:

示例

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> deckRevealedIncreasing(vector& deck) {
      sort(deck.begin(), deck.end());
      int n = deck.size();
      queue <int> q;
      vector <int> ans(n);
      for(int i = 0; i < n; i++)q.push(i);
      int x;
      for(int i = 0; i < n; i++){
         x = q.front();
         q.pop();
         ans[x] = deck[i];
         x = q.front();
         q.pop();
         q.push(x);
      }
      return ans;
   }
};
main(){
   vector<int> v1 = {17,13,11,2,3,5,7};
   Solution ob;
   print_vector(ob.deckRevealedIncreasing(v1));
}

输入

[17,13,11,2,3,5,7]

输出

[2,13,3,11,5,17,7]

更新于: 2020-04-30

371 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告