题目

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

示例

  1. 输入: [0,0,1,2,5]
  2. 输出: True

解析

Method Me
思路:
先统计给定数组中的任意数 0 的个数,将去除任意数的数组从小到大排序并从索引 1 开始遍历数组,判断当前位是否比前一个位大 1?

  • 是,索引下移
  • 否,判断是否存在可用任意数?

    • 存在:则在当前索引上插入[前一位 + 1],数组长度加1
    • 不存在,直接退出 ```javascript var isStraight = function (initArr) { let arr = initArr.filter(item => item === 0) let brr = initArr.filter(item => item !== 0).sort((a, b) => a - b) let useNum = 0

    for (let i = 1; i < brr.length;) { let prevNum = brr[i - 1] let currNum = brr[i]

    // 如果存在相同的,必定不连续 if (currNum === prevNum) return false

    if (currNum - prevNum === 1) {

    1. i += 1

    } else if (useNum < arr.length) {

    useNum += 1
    brr.splice(i, 0, prevNum + 1)
    

    } else {

    return false
    

    } }

    return true } ```

Method 1
解题思路:
1.对原数组排序
2.计算任意牌数量
3.计算差牌数
4.比较任意数和差牌数

var isStraight = function(nums) {
    nums.sort((a, b) => {return a-b})
    let x = 0;
    let j = 0;
    for(let i=0; i< nums.length-1; i++){
        if(nums[i] ===0){
            x++
            continue
        }
        if (nums[i + 1] === nums[i]) return false;
        if(nums[i+1]-nums[i]> 1){
            j += nums[i+1]-nums[i] -1
        }
    }
    return x >= j
};

Method 2
差值判断

var isStraight = function(nums) {
    //从小到大排序
    const minSort = nums.sort((a,b)=> a-b);
    //记录每个数字之间大差值,反正不能大于4
    let sum = 0;
    //不能超过4
    for(let i = 0; i<4;i++){
        //忽略0也就是王
        if(minSort[i] == 0){
            continue
        }
        //如果扑克牌(非0)重复,说明不是顺子
        else if(nums[i] == nums[i+1]){
            return false
        }else{
            //差值记录
            sum += nums[i+1] - nums[i]
        }
    }
    //如果超过4,说明不是顺子。
    return sum<5
};