起源:力扣(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
只有限制住这两个条件,听凭你有没有大王,是什么数字,都是顺子
办法一:利用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 };
办法二:排序和遍历
原理和下面的一样,只不过实现办法不同而已
- 先对数组进行从小到大的排序,找出最大值
- 遍历数组找出最小值(最小值的下标为大王的个数)
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};