这是我参与8月更文挑战的第14天,活动详情查看: 8月更文挑战
题干
从扑克牌中随机抽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
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:max-min<5
这道题实际上是一个技巧题,如果没有找到这个规律之前,这道题实际上很容易被卡到问题里出不来,我刚开始就是这样,总是通不过用例,然后看了解析,直接秀我一脸,自己都笑了
因为我们的最终结构是一个有序的数组,所以我们其实不用考虑数组的长度,只需要考虑最大值与最小值的关系,因为题中给出了0可以代替任何一个数,如果我们符合最大值和最小值的关系,就可以证明这个数组是一个连续的数组。
所以我可以先对数组进行排序,那么大小王的位置就在前面,刚好记录大小王的个数,因为比大小王大的第一个数就是我们的最小值,也就是我们的nums[大小王个数]
,另外还需要一个判断就是当我们元素非0时,前后元素相等可直接返回false
。
看看代码:
/**
* @param {number[]} nums
* @return {boolean}
*/
var isStraight = function (nums) {
//排序
nums.sort((a, b) => {
return a - b
})
let count = 0
for (let i = 0; i < 4; i++) {
if (nums[i] == 0) {
//元素为0时,count+
count++
} else if (nums[i] == nums[i + 1]) {
//元素非0时,前后元素相等
return false
}
}
return nums[4] - nums[count] < 5
};
这里是使用排序+遍历
的方式来进行实现的