''寻找最大葫芦''学习方法与心得 | 豆包MarsCode AI刷题
说在前面
本人控制研究生自学转码前端,本科期间虽然有系统学习过C、自学过python,但编程、算法已荒废多年。不过“葫芦”这一题型依然令我印象深刻,依稀记得是当年的考试重点题型之一,于是便从这题简单的算法题入手,开始青训营的AI刷题打卡。
''葫芦''
在编程中“葫芦”这一牌型题目,对条件判断、循环嵌套和逻辑分支的编程能力有一定要求,我认为是检测编程入门的优质题型,也是我重新捡起编程的好的突破口。本文将基于豆包MarsCode AI平台上的''寻找最大葫芦''题目,从思路解析、代码实现、知识总结到学习建议等方面展开分析。
问题解析
题目描述了“葫芦”这一牌型的组成——三张相同面值的牌和两张相同面值的牌,同时要求这五张牌的面值之和不能超过给定的最大值max。此外,如果有多个符合条件的“葫芦”组合,我们需优先选择三张牌面值较大的组合。如果三张牌的面值相同,再比较两张牌的面值。
这个问题的关键点在于:
- 分组统计:统计每个面值的牌数量,便于后续筛选出“三张相同”和“两张相同”的组合。
- 条件判断:需要确保五张牌的面值和不超过
max。 - 优先级比较:对于符合条件的组合,选择“三张相同”面值较大的组合;若相同,则选择“两张相同”面值较大的组合。
解题思路
- 统计牌面值:首先遍历输入的牌数组,用一个计数数组记录每个面值出现的次数。
- 从大到小枚举面值:从大到小遍历每种牌面值,先寻找出现次数大于等于3的牌作为“三张相同”组合,再寻找出现次数大于等于2的牌作为“两张相同”组合。
- 计算面值和并判断:如果找到一组满足要求的葫芦组合,验证其面值和是否小于或等于
max。如果满足,将该组合更新为当前的最佳组合。 - 最终输出:输出最佳组合中“三张相同”的面值和“两张相同”的面值。如果没有找到符合条件的组合,返回“0, 0”。
代码实现
以下是题目要求的代码实现,并配以详细注释:
def solution(n, max, cards):
# 创建一个数组来统计每个面值的出现次数,索引代表牌面值
count = [0] * 14
for card in cards:
count[card] += 1
# 初始化最佳组合为[0, 0]
best_couple = [0, 0]
# 从高到低遍历面值,寻找“三张相同”的牌
for i in range(13, 0, -1):
if count[i] >= 3:
# 找到满足三张相同条件的牌后,再从高到低寻找“两张相同”的牌
for j in range(13, 0, -1):
if i != j and count[j] >= 2:
# 处理特殊情况:A的面值为1
value_i = 14 if i == 1 else i
value_j = 14 if j == 1 else j
# 判断总面值和是否小于等于max
if 3 * i + 2 * j <= max:
# 更新最佳组合,优先选择三张牌面值较大的组合
if (value_i > best_couple[0]) or (value_i == best_couple[0] and value_j > best_couple[1]):
best_couple = [value_i, value_j]
# 如果最佳组合包含A,需将14还原为1
if best_couple[0] == 14:
best_couple[0] = 1
if best_couple[1] == 14:
best_couple[1] = 1
return best_couple
# 测试用例
if __name__ == "__main__":
print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5]) # 预期输出:[8, 5]
print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9]) # 预期输出:[6, 9]
print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0]) # 预期输出:[0, 0]
代码详解
代码中的关键部分是两层循环。第一层循环用于从大到小选择“三张相同”的牌,第二层循环则用于寻找“两张相同”的牌。条件 (value_i > best_couple[0]) 和 (value_i == best_couple[0] and value_j > best_couple[1]) 确保了我们找到的组合是优先级最高的。
另外,在对A(即面值1)进行特殊处理时,我们使用value_i = 14 if i == 1 else i这一表达式,将A暂时视作最大的牌,方便进行优先级比较,最后再还原。
学习心得与建议
在学习过程中,这道题让我更深刻地理解了枚举法和条件判断的重要性。枚举从高到低排列的面值组合,确保我们能优先选择更高优先级的组合。此外,合理设计和优化判断逻辑,是提高代码效率的关键。
对于像我这样的初学者,我的建议是:
- 分步拆解问题:将题目分解成小任务,每个任务对应代码中的某一部分。比如,先完成统计每个面值数量的功能,再实现从高到低选择“三张相同”的逻辑。
- 练习调试代码:在刷题过程中养成调试的习惯,观察变量变化和代码执行流程。
- 学习优先级处理技巧:在本题中,通过从大到小遍历面值并添加优先级判断,代码可以有效地输出最优解。这种技巧在处理排序、优先选择类问题时很有用。
学习计划
基于豆包MarsCode AI刷题平台的功能,对于我这种编程基础较为薄弱的同学,我更倾向于分阶段提升。先从基本简单的算法题目入手,逐渐过渡到复杂的综合性问题。在刷题时记录错题并分类复习,尤其关注高频错误,这样可以针对性弥补知识盲区。
工具结合与使用建议
豆包MarsCode AI提供的代码检测与题解功能,可以帮助快速发现一些细节上自己难以发现的错误,也可以在没有编程思路时给予提供思路,对像我这种编程基础较为薄弱的同学在解题时提供了非常大的帮助,也建议大家可以多尝试编程与AI相结合。