寻找最大葫芦 刷题分享 | 豆包MarsCode AI 刷题

85 阅读4分钟

一、题目解析:


问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 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]

题目思路:

  1. 题目分析
    我们需要在一个给定的牌组中找到符合条件的最大“葫芦”组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这五张牌的牌面值之和不能超过给定的最大值 max

  2. 数据结构选择

HashMap:用于统计每种牌面值的出现次数。
ArrayList:用于存储符合条件的牌面值(即出现次数大于等于3的牌面值和出现次数大于等于2的牌面值)。

  1. 代码实现(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

新手刷题可以使用以下高效学习方法:

  1. 明确目标,规划时间:每天坚持刷题,从简到难。可以使用豆包MarsCode AI中的“每日推荐”功能制定每日刷题目标,并合理分配时间。
  2. 解析并记录错题:错题重点关注思路和代码实现的差距。通过豆包MarsCode AI的解析功能,找到重难点,并记录在笔记中。
  3. 遇难题逐步突破:将较复杂的题目拆解为小步骤,利用AI的提示功能逐个实现。

错题学习建议

  • 回顾易错知识点。
  • 对比代码与解析代码,找出差异。

四、工具运用


豆包MarsCode AI 在刷题中可以提供十分详细的题解和代码智能纠错功能,还可以寻找网上相关资源整合解决难点:

  1. 参考书籍:例如《算法导论》等。
  2. 在线文档和视频:结合LeetCode、Github等平台的算法教程,与豆包MarsCode解析互补使用。
  3. 实践项目:将学到的知识应用于实践项目,进一步加深理解。

五、总结


通过使用豆包MarsCode AI 刷题工具,使得解题效率、知识总结和错题分析等能力上得到了明显提升。

与相同青训营的同好之志一同学习也能增进相关的结识,与之一同进步,希望这篇分享文章能够帮助到同为初学者之志。