天天看點

字元串06--撲克牌順子

字元串06--撲克牌順子-jz45

  • ​​題目概述​​
  • ​​解析&參考答案​​
  • ​​注意事項​​
  • ​​說明​​

題目概述

  • 算法說明

    現在有2副撲克牌,從撲克牌中随機五張撲克牌,我們需要來判斷一下是不是順子。

    有如下規則:

  1. A為1,J為11,Q為12,K為13,A不能視為14
  2. 大、小王為 0,0可以看作任意牌
  3. 如果給出的五張牌能組成順子(即這五張牌是連續的)就輸出true,否則就輸出false。

    例如:給出資料[6,0,2,0,4]

    中間的兩個0一個看作3,一個看作5 。即:[6,3,2,5,4]

    這樣這五張牌在[2,6]區間連續,輸出true

    資料保證每組5個數字,每組最多含有4個零,數組的數取值為 [0, 13]

  • 測試用例

    示例1

    輸入:[6,0,2,0,4]

    傳回值:true

    示例2

    輸入:[0,3,2,6,4]

    傳回值:true

    示例3

    輸入:[1,0,0,1,0]

    傳回值:false

    示例4

    輸入:[13,12,11,0,1]

    傳回值:false

解析&參考答案

  • 解析

    無對子情況下,max-min+1<=size即為順子(存在0的話就小于size了)

  • 參考答案
vim jz45.go
package main

import (
    "fmt"
    "sort"
)

func IsContinuous(numbers []int) bool {
    length := len(numbers)
    if length == 0 || length > 13 {
        return false
    }
    m := make(map[int]int)
    sort.Ints(numbers)
    min := 0
    max := numbers[length-1]
    for _, v := range numbers {
        m[v]++
        if m[v] > 1 && v != 0 {
            return false
        }
        if v != 0 && min == 0 {
            min = v
        }
    }
    //無對子情況下,max-min+1<=size即為順子
    if (max - min) < length {
        return true
    } else {
        return false
    }
}

func main() {
    arr := []int{1, 3, 2, 6, 4}
    result := IsContinuous(arr)
    fmt.Println(result)
}      

注意事項

  1. 牛可網要求是資料為5個數字,實際上順子可以超過5個數字,是以使用max-min+1<=size的規則就可以判斷更大的順子。

說明

  1. 目前使用 go1.15.8
  2. 參考​​牛客網--劍指offer​​ 标題中jzn(n為具體數字)代表牛客網劍指offer系列第n号題目,例如 jz01 代表牛客網劍指offer中01号題目。
  • 筆者最近在學習 golang,是以趁機通過資料結構和算法來進一步熟悉下go語言
  • 目前算法主要來源于劍指 offer,後續會進一步補充 LeetCode 上重要算法,以及一些經典算法
  • 此處答案僅為參考,不一定是最優解,歡迎感興趣的讀者在評論區提供更優解