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 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.