C++中的順子牌型
假設Rima有一手牌,以整數陣列的形式給出。現在她想把牌洗牌成幾組,每組大小為W,並且由W張連續的牌組成。我們必須檢查這是否可能。
因此,如果牌是[1,2,3,6,2,3,4,7,8],而W = 3,則答案將為true,因為她可以將它們重新排列為[1,2,3]、[2,3,4]、[6,7,8]
為了解決這個問題,我們將遵循以下步驟:
- 定義一個對映m,並將手中每個元素的頻率儲存到m中。
- 當手牌大小不為0時
- prev := 0
- it := 指向m中第一個鍵值對的指標
- 對於範圍0到W – 1中的i
- 當it的值為0時,it := 指向下一對
- 如果i > 0並且it的鍵 – 1 = prev或者i = 0,則
- 將it的值減少1
- prev := it的鍵
- 否則返回false
- it := 指向下一對
- n := n – W
- 返回true。
讓我們看看下面的實現,以便更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int W) {
map <int, int> m;
int n = hand.size();
if(n % W != 0) return false;
for(int i = 0; i < n; i++){
m[hand[i]]++;
}
while(n){
map <int, int> :: iterator it = m.begin();
int prev = 0;
for(int i = 0; i < W; i++){
while(it->second == 0) it++;
if((i > 0 && it->first - 1 == prev) || i == 0){
it->second--;
prev = it->first;
}else{
return false;
}
it++;
}
n -= W;
}
return true;
}
};
main(){
vector<int> v = {1,2,3,6,2,3,4,7,8};
Solution ob;
cout << (ob.isNStraightHand(v, 3));
}輸入
[1,2,3,6,2,3,4,7,8] 3
輸出
1
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP