每日刷题第20天 2021.1.15
扑克中的顺子
- leetcode原题链接:leetcode-cn.com/problems/bu…
- 难度:简单
- 方法:数组、排序
题目
- 从若干副扑克牌中随机抽 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;
};
附录
- 掌握新的预处理数据的方式:排序