您的位置:首页 > 娱乐 > 明星 > 北京市建设工程交易服务平台_海南钢网架公司_网站接广告_做互联网项目怎么推广

北京市建设工程交易服务平台_海南钢网架公司_网站接广告_做互联网项目怎么推广

2025/1/5 15:48:39 来源:https://blog.csdn.net/CodeClimb/article/details/144834851  浏览:    关键词:北京市建设工程交易服务平台_海南钢网架公司_网站接广告_做互联网项目怎么推广
北京市建设工程交易服务平台_海南钢网架公司_网站接广告_做互联网项目怎么推广

【华为OD-E卷 - 德州扑克 100分(python、java、c++、js、c)】

题目

五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一。
判断牌型:
牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。 牌型2,四条:四张相同数字 + 单张,如红桃A黑桃A梅花A方块A + 黑桃K。 牌型3,葫芦:三张相同数字 + 一对,如红桃5黑桃5梅花5 + 方块9梅花9。 牌型4,同花:同一花色,如方块3方块7方块10方块J方块Q。 牌型5,顺子:花色不一样的顺子,如红桃2黑桃3红桃4红桃5方块6。 牌型6,三条:三张相同+两张单。
说明:
(1)五张牌里不会出现牌大小和花色完全相同的牌。 (2)编号小的牌型较大,如同花顺比四条大,依次类推。 (3)包含A的合法的顺子只有10 J Q K A和A 2 3 4 5;类似K A 2 3 4的序列不认为是顺子

输入描述

  • 输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块

输出描述

  • 输出牌型序号,5张牌符合多种牌型时,取最大的牌型序号输出

用例

用例一:
输入:
4 H
5 S
6 C
7 D
8 D
输出:
5
用例二:
输入:
9 S
5 S
6 S
7 S
8 S
输出:
1

python解法

  • 解题思路:
  • 这道题目要求判断给定的五张牌组合是什么类型的牌型,并返回相应的数字编码。我们要根据标准的扑克牌规则来判断牌型。常见的牌型包括顺子(Shunzi)、同花(Tonghua)、三条(Santiao)、葫芦(Hulu)、四条(Sitiao)等。

解题的步骤如下:

输入处理:

我们需要读取五张牌的输入,每张牌由数字和花色组成。输入后将其转换成一个二维列表,方便后续处理。
牌值转换:

将牌的数字(包括 J, Q, K, A 等)转换成数值,以便进行大小比较。
例如:J 转换为 11,Q 转换为 12,K 转换为 13,A 转换为 14。
牌型判断:

顺子(Shunzi):五张牌是连续的。
同花(Tonghua):五张牌的花色相同。
三条(Santiao):有三张相同的牌。
葫芦(Hulu):有三张相同的牌和两张相同的牌。
四条(Sitiao):有四张相同的牌。
返回结果:

根据判断的结果返回相应的牌型编号。例如:顺子同花返回 1,四条返回 2,葫芦返回 3,等等。

# 获取五张牌的输入,输入格式:每行一个数字和花色,格式如 "3 H"
arr = [input().split() for _ in range(5)]# 将牌面值转换为相应的数字值,方便后续比较
def cards(num):if num == "J":return 11elif num == "Q":return 12elif num == "K":return 13elif num == "A":return 14else:return int(num)# 用于判断一组牌是否满足特定条件:
# partCount:分成几组相同的牌
# maxSameNumCount:每组最多相同的牌的数量
def countNums(nums, partCount, maxSameNumCount):count = {}# 统计每种牌的数量for num in nums:if count.get(num) is None:count[num] = 0count[num] += 1# 判断是否有 partCount 种牌if len(count.keys()) != partCount:return False# 判断是否有 maxSameNumCount 个相同的牌return maxSameNumCount in count.values()# 判断是否是三条:有三张相同的牌
def isSantiao(nums):return countNums(nums, 3, 3)# 判断是否是葫芦:有三张相同的牌和两张相同的牌
def isHulu(nums):return countNums(nums, 2, 3)# 判断是否是四条:有四张相同的牌
def isSitiao(nums):return countNums(nums, 2, 4)# 判断是否是同花:五张牌的花色相同
def isTonghua(colors):return len(set(colors)) == 1# 判断是否是顺子:五张牌是连续的
def isShunzi(nums):# 特殊情况:2345A,A作为1处理if "".join(nums) == "2345A":return True# 判断牌是否连续for i in range(1, len(nums)):if cards(nums[i - 1]) + 1 != cards(nums[i]):return Falsereturn True# 获取最终结果的函数
def getResult():nums = []colors = []# 分离出牌面数字和花色for num, color in arr:nums.append(num)colors.append(color)# 对牌面值进行排序nums.sort(key=lambda x: cards(x))# 判断各种牌型的优先级if isShunzi(nums) and isTonghua(colors):  # 同花顺return 1elif isSitiao(nums):  # 四条return 2elif isHulu(nums):  # 葫芦return 3elif isTonghua(colors):  # 同花return 4elif isShunzi(nums):  # 顺子return 5elif isSantiao(nums):  # 三条return 6else:  # 其他情况return 0# 输出最终的牌型编号
print(getResult())

java解法

  • 解题思路
  • 这道题目要求根据输入的五张牌的点数和花色,判断其牌型并返回对应的编码。常见的牌型有同花顺、四条、葫芦、同花、顺子、三条等。

解题步骤如下:

输入获取:

从输入中获取五张牌的点数(数字或字母)和花色。每张牌由一个数字(或字母表示的特殊牌,如 J, Q, K, A)和一个花色组成。
牌值转换:

将牌面上的字符(例如 J, Q, K, A)转换为数字值,方便后续排序和比较。
J 转换为 11
Q 转换为 12
K 转换为 13
A 转换为 14
数字牌保持不变。
分析牌型:

同花顺(Straight Flush):五张牌是连续的,并且花色相同。
四条(Four of a Kind):有四张相同的牌。
葫芦(Full House):有三张相同的牌和两张相同的牌。
同花(Flush):五张牌的花色相同。
顺子(Straight):五张牌是连续的,不考虑花色。
三条(Three of a Kind):有三张相同的牌。
返回结果:

根据不同的牌型,返回对应的数字编码。例如:同花顺返回 1,四条返回 2,葫芦返回 3,等等。如果不符合任何牌型,返回 0。

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] nums = new String[5];   // 存储五张牌的点数String[] suits = new String[5];  // 存储五张牌的花色// 输入五张牌的点数和花色for (int i = 0; i < 5; i++) {nums[i] = sc.next();   // 输入点数suits[i] = sc.next();  // 输入花色}// 输出牌型结果System.out.println(getResult(nums, suits));}// 根据牌的点数和花色来判断牌型public static int getResult(String[] nums, String[] suits) {// 使用 TreeSet 存储牌的数值,保证自动排序TreeSet<Integer> values = new TreeSet<>();// 使用 Map 存储每个点数的出现次数Map<String, Integer> count = new HashMap<>();// 使用 Set 存储花色,判断是否同花Set<String> suitSet = new HashSet<>(Arrays.asList(suits));// 遍历所有牌,转换成数值并统计点数出现次数for (String num : nums) {int cardVal = cardValue(num);  // 将牌的点数转换为数值values.add(cardVal);           // 将牌数值加入到 TreeSet,自动排序count.put(num, count.getOrDefault(num, 0) + 1); // 更新点数出现次数}// 判断是否是同花:如果所有花色相同,则为同花boolean isFlush = suitSet.size() == 1;// 判断是否是顺子:如果牌的最大值与最小值差为 4 且牌数为 5,则为顺子// 或者特殊情况:A, 2, 3, 4, 5 也是顺子boolean isStraight = (values.last() - values.first() == 4 && values.size() == 5) || isLowAceStraight(values);// 牌型判断,从高到低:if (isStraight && isFlush) return 1; // 同花顺if (hasCount(count, 4)) return 2;    // 四条if (hasCount(count, 3) && hasCount(count, 2)) return 3;  // 葫芦if (isFlush) return 4;   // 同花if (isStraight) return 5;  // 顺子if (hasCount(count, 3)) return 6;   // 三条return 0;  // 没有符合的牌型}// 判断是否有某个点数出现 num 次private static boolean hasCount(Map<String, Integer> count, int num) {return count.containsValue(num);}// 判断是否是 A 2345 这种顺子(特殊情况)private static boolean isLowAceStraight(TreeSet<Integer> values) {return values.contains(14) && values.contains(2) && values.contains(3) && values.contains(4) && values.contains(5);}// 将牌的点数转换为数值private static int cardValue(String num) {switch (num) {case "J": return 11;  // Jackcase "Q": return 12;  // Queencase "K": return 13;  // Kingcase "A": return 14;  // Acedefault: return Integer.parseInt(num);  // 其他牌是数字,直接返回数字}}
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com