扑克牌顺子


题目:现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:

1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
例如:给出数据[6,0,2,0,4]
中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true
数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]

思路:

  • 1.数组排序
  • 2.遍历数组
  • 3.若为0,记录0的个数加1
  • 4.若不为0,记录和下一个元素的间隔
  • 5.最后比较0的个数和间隔数,间隔数>0的个数则不能构成顺子
  • 6.注意中间如果有两个元素相等则不能构成顺子

代码:

 1 function IsContinuous(numbers)
 2 {
 3     // write code here
 4        /* 
 5        分治思想 五张牌构成顺子的充分条件需要满足
 6        1. 不重复 使用Set去重
 7        2. max - min < 5 最大牌值 减去 最小牌值 小于5 且跳过大小王
 8     */
 9 
10 const set = new Set();
11 let min = 14, max = 0; // min和max的初始值是两个边界值[0, 13]
12     for(const i of numbers){
13          // 遇到大小王 跳过
14         if(!i) continue;
15          // 遇到重复则直接 返回false
16         if(set.has(i)) return false;
17         set.add(i);
18          // 迭代更新 min和max 以及set
19        min = Math.min(min, i);
20         max = Math.max(max, i);
21     }
22     return max - min < 5;
23 }
24 module.exports = {
25     IsContinuous : IsContinuous
26 };

 

 1 function IsContinuous(numbers)
 2 {
 3     // write code here
 4     if (numbers && numbers.length > 0) {
 5         numbers.sort();
 6         let kingNum = 0;
 7         let spaceNum = 0;
 8         for (let i = 0; i < numbers.length - 1; i++) {
 9           if (numbers[i] === 0) {
10             kingNum++;
11           } else {
12             const space = numbers[i + 1] - numbers[i];
13             if (space == 0) {
14               return false;
15             } else {
16               spaceNum += space - 1;
17             }
18           }
19         }
20         return kingNum - spaceNum >= 0;
21       }
22       return false;
23 }
24 module.exports = {
25     IsContinuous : IsContinuous
26 };

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM