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]
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP