剑指 Offer 61. 扑克牌中的顺子(排序)

208 阅读1分钟

每日刷题第20天 2021.1.15

扑克中的顺子

题目

  • 从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例

  • 示例1
输入: [1,2,3,4,5]
输出: True
  • 示例2
输入: [0,0,1,2,5]
输出: True

限制

  • 数组长度为 5 
  • 数组的数取值为 [0, 13] .

解法

  • 需要注意✨,数据的预处理:排序
    • 排序后的数组,会将所有的0数据,全部放到数组的开始位置,便于统计,并且不会妨碍后续的两数之间的比较
    • 举例:1,2,3,0,6 => 排序后 0,1,2,3,6
  • 排好序后,1.统计0的个数。2.模拟前后两数之间的差值比较
    • 举例:2 5 之间差 3 4,当数组中存在两个0的时候,才返回true
    • 有一种特例2 2之间什么都不差,这时需要返回false,因为不是连续的5张牌.即:cha >= 0
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var isStraight = function(nums) {
  // 判断是否为连续的数值
  // 统计0的个数,从中断点计算加上0的个数,是否可以链接起来
  // 先排序
  nums.sort((a, b) => a - b);
  // console.log('排好序',nums);
  // 统计大小王个数
  let bigSmall = 0;
  for (let i = 0; i < nums.length - 1; i++) {
    if (nums[i] == 0) {
      bigSmall++;
    }else if (nums[i] + 1 != nums[i + 1]) {
      cha = nums[i + 1] - nums[i] - 1;
      // console.log('进入1',cha,nums[i],nums[i + 1]);
      // 并且差要大于0,避免2 2 ,相同的相邻的情况
      if (bigSmall >= cha && cha >= 0) {
        // console.log('进入');
        // 空格数大于差值
        bigSmall -= cha;
      }else {
        // 空格数小于差值
        return false;
      }
    }
  }
  return true;
};

附录

  • 掌握新的预处理数据的方式:排序