Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
从若干副扑克牌中随机抽 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]
二、思路分析
- 两个条件:第一个数组中最大值减去最小值小于5,数组中除了0没有重复元素
- 首先将数组排序,假设小丑joker(大小王)下标为0。遍历数组,如果数组元素等于0,则joker++,后续判断重复,如果i≠0,防止越界,并且nums[i]==nums[i-1]则直接返回false。
- 中间记录最大最小值。
- 如果最大最小值相减,小于5则返回true,表示是顺子。
三、AC 代码
func isStraight(nums []int) bool {
sort.Ints(nums)
joker := 0
min := math.MaxInt32
max := 0
for i,num := range nums {
if num == 0 {
joker++
continue
}
//判断重复
if i != 0 && nums[i] == nums[i-1] {
return false
}
if num > max {
max = num
}
if num < min {
min = num
}
}
if max - min >= 5 {
return false
}
return true
}
四、总结
本题最关键是两个条件是,最大最小值相减可以小于5,以及扑克中除了大小王不可以重复出现其他数字。go中使用快排时间复杂度为O(nlogn)