字元串06--撲克牌順子-jz45
- 題目概述
- 解析&參考答案
- 注意事項
- 說明
題目概述
-
算法說明
現在有2副撲克牌,從撲克牌中随機五張撲克牌,我們需要來判斷一下是不是順子。
有如下規則:
- A為1,J為11,Q為12,K為13,A不能視為14
- 大、小王為 0,0可以看作任意牌
-
如果給出的五張牌能組成順子(即這五張牌是連續的)就輸出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)
}
注意事項
- 牛可網要求是資料為5個數字,實際上順子可以超過5個數字,是以使用max-min+1<=size的規則就可以判斷更大的順子。
說明
- 目前使用 go1.15.8
- 參考牛客網--劍指offer 标題中jzn(n為具體數字)代表牛客網劍指offer系列第n号題目,例如 jz01 代表牛客網劍指offer中01号題目。
- 筆者最近在學習 golang,是以趁機通過資料結構和算法來進一步熟悉下go語言
- 目前算法主要來源于劍指 offer,後續會進一步補充 LeetCode 上重要算法,以及一些經典算法
- 此處答案僅為參考,不一定是最優解,歡迎感興趣的讀者在評論區提供更優解