字符串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 上重要算法,以及一些经典算法
  • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一个更完整的 PHP 扑克牌比大小的代码示例: ```php /** * 将扑克牌字符串转换为数组 * @param string $cardsStr 扑克牌字符串,如 "10H 9D AS KC" * @return array 扑克牌数组,如 array("10H", "9D", "AS", "KC") */ function convertCardsToArray($cardsStr) { $cards = explode(" ", $cardsStr); return $cards; } /** * 获取扑克牌的点数 * @param string $card 扑克牌,如 "10H" * @return int 扑克牌点数,如 10 */ function getCardValue($card) { $cardValues = array( 'A' => 14, 'K' => 13, 'Q' => 12, 'J' => 11, '10' => 10, '9' => 9, '8' => 8, '7' => 7, '6' => 6, '5' => 5, '4' => 4, '3' => 3, '2' => 2 ); return $cardValues[$card[0]]; } /** * 判断扑克牌是否为同花 * @param array $cards 扑克牌数组 * @return bool 是否为同花 */ function isFlush($cards) { $suits = array(); foreach ($cards as $card) { $suits[] = $card[1]; } return count(array_unique($suits)) == 1; } /** * 判断扑克牌是否为顺子 * @param array $cards 扑克牌数组 * @return bool 是否为顺子 */ function isStraight($cards) { $cardValues = array(); foreach ($cards as $card) { $cardValues[] = getCardValue($card); } sort($cardValues); $minValue = $cardValues[0]; for ($i = 1; $i < count($cardValues); $i++) { if ($cardValues[$i] != $minValue + $i) { return false; } } return true; } /** * 获取扑克牌的组合类型 * @param array $cards 扑克牌数组 * @return string 组合类型,如 "同花顺"、"四条"、"葫芦"、"同花"、"顺子"、"三条"、"两对"、"一对"、"高牌" */ function getHandType($cards) { $cardCounts = array(); foreach ($cards as $card) { $value = getCardValue($card); if (!isset($cardCounts[$value])) { $cardCounts[$value] = 0; } $cardCounts[$value]++; } arsort($cardCounts); $cardValues = array_keys($cardCounts); $cardCounts = array_values($cardCounts); $maxCount = $cardCounts[0]; $secondCount = isset($cardCounts[1]) ? $cardCounts[1] : 0; $thirdCount = isset($cardCounts[2]) ? $cardCounts[2] : 0; $fourthCount = isset($cardCounts[3]) ? $cardCounts[3] : 0; $fifthCount = isset($cardCounts[4]) ? $cardCounts[4] : 0; $isFlush = isFlush($cards); $isStraight = isStraight($cards); if ($isFlush && $isStraight) { return "同花顺"; } elseif ($maxCount == 4) { return "四条"; } elseif ($maxCount == 3 && $secondCount == 2) { return "葫芦"; } elseif ($isFlush) { return "同花"; } elseif ($isStraight) { return "顺子"; } elseif ($maxCount == 3) { return "三条"; } elseif ($maxCount == 2 && $secondCount == 2) { return "两对"; } elseif ($maxCount == 2) { return "一对"; } else { return "高牌"; } } /** * 比较两手扑克牌的大小 * @param array $hand1 手牌1,如 array("10H", "9D", "AS", "KC") * @param array $hand2 手牌2,如 array("10H", "9D", "AS", "KC") * @return int 比较结果,1 表示手牌1大,-1 表示手牌2大,0 表示平局 */ function compareHands($hand1, $hand2) { $hand1Type = getHandType($hand1); $hand2Type = getHandType($hand2); if ($hand1Type != $hand2Type) { $handTypes = array( "高牌" => 1, "一对" => 2, "两对" => 3, "三条" => 4, "顺子" => 5, "同花" => 6, "葫芦" => 7, "四条" => 8, "同花顺" => 9 ); return $handTypes[$hand1Type] > $handTypes[$hand2Type] ? 1 : -1; } else { $cardValues1 = array(); $cardValues2 = array(); foreach ($hand1 as $card) { $cardValues1[] = getCardValue($card); } foreach ($hand2 as $card) { $cardValues2[] = getCardValue($card); } rsort($cardValues1); rsort($cardValues2); for ($i = 0; $i < count($cardValues1); $i++) { if ($cardValues1[$i] > $cardValues2[$i]) { return 1; } elseif ($cardValues1[$i] < $cardValues2[$i]) { return -1; } } return 0; } } // 示例用法 $hand1 = convertCardsToArray("10H 9D AS KC"); $hand2 = convertCardsToArray("JD QS KH AC"); $result = compareHands($hand1, $hand2); if ($result == 1) { echo "手牌1大"; } elseif ($result == -1) { echo "手牌2大"; } else { echo "平局"; } ``` 这个示例代码中,我们实现了扑克牌字符串到数组的转换、获取扑克牌点数、判断扑克牌是否为同花或顺子、获取扑克牌的组合类型、比较两手扑克牌大小的功能。您可以通过调用这些函数来完成扑克牌比大小的操作。需要注意的是,这个示例代码只考虑了两手牌的比较,如果您需要比较多手牌,需要进行相应的扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值