剑指Offer61|扑克牌中的顺子

199 阅读1分钟

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]

二、思路分析

  1. 两个条件:第一个数组中最大值减去最小值小于5,数组中除了0没有重复元素
  2. 首先将数组排序,假设小丑joker(大小王)下标为0。遍历数组,如果数组元素等于0,则joker++,后续判断重复,如果i≠0,防止越界,并且nums[i]==nums[i-1]则直接返回false。
  3. 中间记录最大最小值。
  4. 如果最大最小值相减,小于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)