题目
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例
输入: [0,0,1,2,5]输出: 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) {
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
};
