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
廣告