在刷题中进步 | 豆包MarsCode AI刷题

69 阅读6分钟

学习笔记:德州扑克中的“葫芦”组合问题解析

题目解析

问题描述
在德州扑克游戏中,我们需要找到符合规则的最大“葫芦”组合。一个“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a 和另外两张相同牌面值的牌 b。牌面值之和不能超过给定的最大值 max。若存在多个符合条件的“葫芦”,选择 a 最大的那个;若 a 相同,则选择 b 最大的那个。

解题思路

  1. 统计每种牌面值的出现次数:使用 Counter 来统计输入数组中每种牌面值的出现次数。
  2. 自定义排序规则:由于牌面值的大小规则为 A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为 1,但在排序时应该视为最大,所以需要自定义排序规则。
  3. 对牌面值进行排序:根据自定义排序规则对牌面值进行排序,以便后续查找符合条件的“葫芦”组合。
  4. 查找符合条件的“葫芦”组合:通过两层循环遍历排序后的牌面值,查找满足条件的“葫芦”组合,即三张 a 和两张 b 的组合,且其牌面值之和不超过 max
  5. 返回结果:若找到符合条件的“葫芦”组合,则返回 [a, b];否则返回 [0, 0]

代码详解: 当然,我们可以将代码进一步分区并详细解释每一部分的功能。以下是代码的分区解释:

代码分区解释

1. 导入模块和函数定义

python复制代码
	from collections import Counter

	 

	def solution(n, max_val, array):
  • from collections import Counter:从collections模块导入Counter类,用于统计列表中每个元素的出现次数。
  • def solution(n, max_val, array)::定义了一个名为solution的函数,该函数接受三个参数:n(通常表示牌的数量,但在此问题中未使用),max_val(牌面值之和的最大值),array(包含所有牌面值的列表)。

2. 统计牌面值出现次数

python复制代码
	count = Counter(array)
  • count = Counter(array):使用Counter类统计array列表中每个牌面值出现的次数,结果存储在count字典中。

3. 自定义排序规则

	def custom_sort(x):

	        if x == 1:

	            return 14

	        return x
  • def custom_sort(x)::定义了一个名为custom_sort的函数,该函数接受一个参数x(牌面值)。
  • if x == 1: return 14:如果x等于1(即A),则返回14,因为在扑克中A通常被视为最大。
  • return x:否则,返回x本身。

4. 排序牌面值


	sorted_values = sorted(count.keys(), key=custom_sort, reverse=True)
  • sorted_values = sorted(count.keys(), key=custom_sort, reverse=True):使用sorted函数对count.keys()(即牌面值的集合)进行排序。排序键为custom_sort函数,排序方式为降序(reverse=True)。结果存储在sorted_values列表中。

5. 查找“葫芦”组合

	for a in sorted_values:

	        if count[a] >= 3:

	            for b in sorted_values:

	                if a != b and count[b] >= 2:

	                    if 3 * a + 2 * b <= max_val:

	                        return [a, b]
  • for a in sorted_values::外层循环,遍历排序后的牌面值列表sorted_values,变量a表示“葫芦”中的三张相同牌面值的牌。
  • if count[a] >= 3::判断a牌面值的数量是否大于等于3。
  • for b in sorted_values::内层循环,再次遍历排序后的牌面值列表sorted_values,变量b表示“葫芦”中的两张相同牌面值的牌。
  • if a != b and count[b] >= 2::判断ab是否相同,并且b牌面值的数量是否大于等于2。
  • if 3 * a + 2 * b <= max_val::计算牌面值之和,判断是否小于等于max_val
  • return [a, b]:如果找到符合条件的“葫芦”组合,则立即返回[a, b]

6. 返回结果(未找到符合条件的“葫芦”组合)


	return [0, 0]
  • return [0, 0]:如果遍历完所有可能的组合后仍未找到符合条件的“葫芦”组合,则返回[0, 0]

知识总结

新知识点

  • Counter:用于统计可哈希对象的出现次数,适用于本题中对牌面值出现次数的统计。
  • 自定义排序规则:通过定义排序键(key)来实现自定义排序,本题中用于处理 A 的特殊排序需求。
  • 两层循环查找:通过嵌套循环遍历所有可能的组合,查找满足条件的解。

理解

  • 本题的关键在于理解“葫芦”的定义和排序规则,然后利用统计和排序技巧高效地查找符合条件的组合。
  • 自定义排序规则在处理特殊需求时非常有用,可以灵活地调整排序顺序。

学习建议

  • 对于初学者,建议多练习使用 Counter 和自定义排序规则,掌握这些技巧在处理类似问题时可以大大提高效率。
  • 熟悉两层循环查找的逻辑,学会在复杂问题中分解问题,逐步求解。

学习计划

制定刷题计划

  1. 基础阶段:每天刷一定数量的基础题目,巩固基本的数据结构和算法知识。
  2. 进阶阶段:逐渐增加题目的难度,尝试解决一些需要运用多种技巧的综合题目。
  3. 冲刺阶段:重点复习错题和难点,针对自己的薄弱环节进行强化训练。

利用错题进行针对性学习

  • 对于做错的题目,要仔细分析错误原因,找到问题所在。
  • 将错题整理成错题本,定期回顾和复习,避免重复犯错。
  • 针对错题所涉及的知识点进行专项训练,加强理解和记忆。

工具运用

结合 AI 刷题功能

  • 利用 AI 刷题功能对自己做过的题进行复盘。
  • 分析 AI 提供的解题思路和答案,学习不同的解题方法和技巧。
  • 将 AI 提供的题目和解析与自己的学习资源进行整合,形成自己的知识体系。

其他学习资源

  • 观看相关的视频教程和直播课程,加深对数据结构和算法的理解。
  • 阅读相关的ai书籍和刷题博客文章,拓宽视野和知识面。
  • 参与豆包编程社区和论坛的讨论,与他人交流学习心得和经验。

通过综合运用以上方法和资源,在豆包AI刷题上可以更有效地学习数据结构和算法,提高编程能力和解决问题的能力。