1
头图

来源:力扣(LeetCode)

从扑克牌中随机抽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] .

首先这道需要先找一下规律,有三种情况:

  • 没有大王:如 :1、2、3、4、5
  • 只有一个大王: 如:0、1、2、3、4
  • 有两个大王: 如: 0、0、1、2、5

要想没有重复的牌,那么首先必须是没有重复的牌(0除外),其次是牌中最大值和最小值相差不能大于4

只要限制住这两个条件,任凭你有没有大王,是什么数字,都是顺子

img

方法一:利用Set 和 遍历

  • Set 用于存储非0数字,并且判断有无重复的数字
  • 遍历的同时需要找出最小值和最大值
var isStraight = function(nums) {
    // 创建Set对象
    let set = new Set()
    // 给最大值赋最小的初始值,给最小值赋最大的初始值
    let max = 1
    let min = 13
    for (let i =0, n = nums.length; i < n; i++) {
        // 遍历到0直接跳过,进入下一个数
        if (nums[i] === 0) {
            continue
        }
        // 出现重复,直接返回false
        if (set.has(nums[i])) {
            return false;
        }
        // 添加值
        set.add(nums[i])
        max = Math.max(max, nums[i])
        min = Math.min(min, nums[i])
    }   
    // 判断最大数和最小数之差
    return max - min < 5 
};

img

方法二:排序和遍历

原理和上面的一样,只不过实现方法不同而已

  • 先对数组进行从小到大的排序,找出最大值
  • 遍历数组找出最小值(最小值的下标为大王的个数
var isStraight = function(nums) {
    nums.sort((a, b) => {
        return a - b
    })
    let max = nums[4]
    let m = 0
    for (let i = 0,n = nums.length - 1; i < n; i++) {
        // 最小值的索引为0的个数
        if (nums[i] === 0) {
            m++
        } else if (nums[i] === nums[i+1]) {
            return false
        }
    }
    return max - nums[m] < 5
};

img


蝼蚁之行
31 声望1 粉丝

日益努力然后风声水起


« 上一篇
封装Ajax
下一篇 »
Ajax跨域请求