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]