文章目录
- 题目
- 题目决议
- 解题思维
- 1.既然每组牌都是顺子,那么我们就像牌进行排序(升序),
- 2. 排好了序,就是遍历阵列hand,去判断手牌是否groupSize组,每组groupSize 张,且是一个顺子(从左往右,点数依次加一),
- 当整个回圈结束时,也就是说 满足题目要求(我有一手顺子牌),回传true,
- 最后附上程序
- 代码细节
题目
?
题目决议
细节:我采用的是双重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张牌,
// 且为顺子关系,
}
}
0 评论