文章目錄
- 題目
- 題目決議
- 解題思維
- 1.既然每組牌都是順子,那么我們就像牌進行排序(升序),
- 2. 排好了序,就是遍歷陣列hand,去判斷手牌是否groupSize組,每組groupSize 張,且是一個順子(從左往右,點數依次加一),
- 當整個回圈結束時,也就是說 滿足題目要求(我有一手順子牌),回傳true,
- 最后附上程式
- 代碼細節
題目

?
題目決議
簡單來說 我手上 有一組牌,有 groupSize 張,且又可以分成 groupSize 組,每組都是一個順子(牌的大小,從左往右,依次加1),
?
解題思維
1.既然每組牌都是順子,那么我們就像牌進行排序(升序),

?
2. 排好了序,就是遍歷陣列hand,去判斷手牌是否groupSize組,每組groupSize 張,且是一個順子(從左往右,點數依次加一),
細節:我采用的是雙重for回圈,外層for回圈用來遍歷陣列(已排序),嵌套的for回圈基于外層for回圈的基礎上(外層回圈變數 i = 0, 內層回圈變數 j = i + 1),方便我們來比較 相鄰的兩張牌,是否構成順子結構【hand[ j ] - hand[ i ] == 1】,而且我們一次比較完后,將 hand[ j ] = -1,因為題目中,我們可以根據案例得知,每張牌在順子中只能出現一次,
跳出內層for‘回圈有兩個條件,滿足任意一個條件即可:
1、 j 遍歷完陣列(該情況又可以分為兩種:1.沒有找到滿足順子關系的牌,一直往后走,直到遍歷完陣列,2.找到滿足了順子關系的第 groupSize 組 最后一張也是最大的一張牌)
2、groupSize組牌,某組牌中,在它的 groupSize 張 牌,滿足順子條件,
最關鍵的是第二條:如果 count 在內回圈結束后,不滿足 count == groupSize-1,那么毫無疑問是回傳false,而且:也幫我們限制內層回圈的次數,加 i 的這一次,剛好是 groupSize 張牌,
細節部分: 內層回圈只判斷了 1 組牌中 groupSize 張牌是否是順子,
當 內層回圈結束時,且此時內層回圈判斷的這組牌滿足順子條件( count ==groupSize -1 ),會外層回圈,通過一系列操作判斷,進行下一組牌的判斷, 意味著count 需要重新 計數(count = 0),
?
當整個回圈結束時,也就是說 滿足題目要求(我有一手順子牌),回傳true,

?
最后附上程式
class Solution {
public boolean isNStraightHand(int[] hand, int groupSize) {
Arrays.sort(hand);
int n = hand.length;
int count = 0;
for(int i = 0; i < n;i++){
if(hand[i]== -1){//順子中出現過的牌,直接跳過
continue;
}
count = 0;
for(int j = i+1; j < n && count != groupSize-1;j++){
if(hand[j] - hand[i] == count + 1){
// 判斷是否 滿足順子條件:第二張牌 比 第一張牌大一點,第三張比第一張大兩點,
// 以此類推: 第 groupSize張牌,比第一張牌大 groupSize - 1 點
// 所以 count 就是用來記錄 每張牌(除了第一張) 與 第一張牌的大小關系,
// 順便可以作為 回圈限制條件(陣列hand,可以發為 groupSize組 和 每組有 groupSize 張 )
// 至于為什么要減一,那是因為 第一張牌是用來比較的基準,而且已經 i “拿走了”,
// 所以我們 只需要判斷 hand[i] 后面 groupSize-1 張牌,
hand[j] = -1;// 表示這張牌出現過
count++;
}
}
if(count != groupSize - 1){// 如果回圈結束時,count 的最終結果并不滿足順子條件,回傳false,
return false;
}
}
return true;
// 整個回圈結束時,并且走到這一步,說明 hand 陣列,確實可以將牌分為 groupSize組,每組有 groupSize張牌,
// 且為順子關系,
}
}

代碼細節

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/398676.html
標籤:java
上一篇:括號匹配問題
下一篇:【Java資料結構】哈希表詳解


