一、题目解析:
问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
测试样例
样例1:
输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]
题目思路:
-
题目分析:
我们需要在一个给定的牌组中找到符合条件的最大“葫芦”组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这五张牌的牌面值之和不能超过给定的最大值max。 -
数据结构选择
HashMap:用于统计每种牌面值的出现次数。
ArrayList:用于存储符合条件的牌面值(即出现次数大于等于3的牌面值和出现次数大于等于2的牌面值)。
- 代码实现(Java)
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static int[] solution(int n, int max, int[] array) {
//统计每种牌面值的出现次数
Map<Integer, Integer> countMap = new HashMap<>();
for (int card : array) {
countMap.put(card, countMap.getOrDefault(card, 0) + 1);
}
//筛选符合条件的牌面值
List<Integer> countA = new ArrayList<>();
List<Integer> countB = new ArrayList<>();
for (Entry<Integer, Integer> entry : countMap.entrySet()) {
if (entry.getValue() >= 3) {
countA.add(entry.getKey());
}
if (entry.getValue() >= 2) {
countB.add(entry.getKey());
}
}
//从大到小排序
Collections.sort(countA, Collections.reverseOrder());
Collections.sort(countB, Collections.reverseOrder());
//找出最佳组合
int[] bestCombination = {0, 0};
for (int a : countA) {
for (int b : countB) {
if (a != b && a * 3 + b * 2 <= max) {
if (a == 1) {
bestCombination[0] = a;
bestCombination[1] = b;
break;
}else if (a > bestCombination[0] || (a == bestCombination[0] && b > bestCombination[1]) || (a == bestCombination[0] && b == 1)) {
bestCombination[0] = a;
bestCombination[1] = b;
}
}
}
}
return bestCombination;
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(java.util.Arrays.equals(solution(9, 34, new int[]{6, 6, 6, 8, 8, 8, 5, 5, 1}), new int[]{8, 5}));
System.out.println(java.util.Arrays.equals(solution(9, 37, new int[]{9, 9, 9, 9, 6, 6, 6, 6, 13}), new int[]{6, 9}));
System.out.println(java.util.Arrays.equals(solution(9, 40, new int[]{1, 11, 13, 12, 7, 8, 11, 5, 6}), new int[]{0, 0}));
}
}
二、知识总结
代码解析
算法步骤
统计牌面值的出现次数:遍历牌组,使用 HashMap 统计每种牌面值的出现次数。
筛选符合条件的牌面值:
- 遍历 `HashMap`,将出现次数大于等于3的牌面值存入 `countA` 列表。
- 将出现次数大于等于2的牌面值存入 `countB` 列表。
排序:将 countA 和 countB 列表按牌面值从大到小排序。
找出最佳组合:
- 遍历 `countA` 列表中的每个牌面值 `a`。
- 对于每个 `a`,遍历 `countB` 列表中的每个牌面值 `b`。
- 检查 `a` 和 `b` 是否不同,并且 `a * 3 + b * 2` 是否小于等于 `max`。
- 如果满足条件,更新最佳组合。
返回结果:如果没有找到符合条件的组合,返回 [0, 0]。
三、学习计划
高效利用豆包MarsCode AI
新手刷题可以使用以下高效学习方法:
- 明确目标,规划时间:每天坚持刷题,从简到难。可以使用豆包MarsCode AI中的“每日推荐”功能制定每日刷题目标,并合理分配时间。
- 解析并记录错题:错题重点关注思路和代码实现的差距。通过豆包MarsCode AI的解析功能,找到重难点,并记录在笔记中。
- 遇难题逐步突破:将较复杂的题目拆解为小步骤,利用AI的提示功能逐个实现。
错题学习建议
- 回顾易错知识点。
- 对比代码与解析代码,找出差异。
四、工具运用
豆包MarsCode AI 在刷题中可以提供十分详细的题解和代码智能纠错功能,还可以寻找网上相关资源整合解决难点:
- 参考书籍:例如《算法导论》等。
- 在线文档和视频:结合LeetCode、Github等平台的算法教程,与豆包MarsCode解析互补使用。
- 实践项目:将学到的知识应用于实践项目,进一步加深理解。
五、总结
通过使用豆包MarsCode AI 刷题工具,使得解题效率、知识总结和错题分析等能力上得到了明显提升。
与相同青训营的同好之志一同学习也能增进相关的结识,与之一同进步,希望这篇分享文章能够帮助到同为初学者之志。