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

287 阅读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]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]

解题思路

  1. 数据结构选择:

    • 使用字典来统计每种牌面值的数量。
    • 使用列表来存储牌面值,并进行排序。
  2. 算法步骤:

    1. 统计每种牌面值的数量。

    2. 对牌面值进行排序,从大到小,特别注意A的牌面值为14(而不是1)。

    3. 遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合:

      • 首先尝试找到三张相同牌面值的牌。
      • 然后尝试找到两张相同牌面值的牌。
      • 检查组合的牌面值之和是否不超过给定的最大值。
      • 同时还要注意1大于其他所有数的情况,所以暂时记为14,并在判断之前还原
import java.util.Arrays;

public class Main {
    public static int[] solution(int n, int max, int[] array) {
        // Edit your code here
        //先统计每种牌的数量 3张以上可以做葫芦的两种牌型 2张只能做为1种
        //a*3+b*2<=max
        //1>13>...>2
        //先找出最大a 再找最大b判断满不满足不超过sum
        int[] a = new int[14];//标记数组
        int i = 0;
        int j = 0;//a
        int k = 0;//b
        int l = 0;
        for(i = 0; i < n; i++){
            a[array[i]]++;//数量增加
        } 
        if(a[1] >= 3)//1在3张以上,1可以做a
        {
            j = 1;            
            //int temp = 0;
            for(i = 13; i > 1; i--)
            {
                //找b                
                if(a[i] >= 2 && 3 + i*2 <= max)//找到符合条件的
                {
                    k = i;
                    break;
                }              
            }
        }
        else//1不能做a
        {
            //int temp1 = 0;
            //int temp2 = 0;
            for(i = 13; i > 1; i--)
            {
                if(a[i] >= 3 && a[1] >= 2 && i*3 + 2 <= max)//b可以当1
                {
                    j = i;
                    k = 1;
                    break;
                }
                for(l = 13; l > 0; l--)
                {
                    if(a[i] >= 3 && a[l]>= 2 && i != l && i*3 + l*2 <= max)//找到符合条件的
                {
                    System.out.println(i*3 + l*2);
                    j = i;
                    k = l;
                    break;
                }
                }
                if(j != 0 || k != 0)
                {
                    break;
                }
            }
        }
        if(j == 0 || k == 0)
        {return new int[]{0, 0};}
        else
        {return new int[]{j,k};}
    }

    public static void main(String[] args) {
        // Add your test cases here
        int n = 9;
        int max = 34;
        int[] array = {6,6,6,8,8,8,1,5,5};
        System.out.println(Arrays.toString(solution(n,max,array)));

        //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}));
    }
}

个人总结

  1. 数组初始化:我们定义了一个数组来存储葫芦大小的数据。
  2. 找出最大值:通过遍历整个数组,我们比较每个元素来找到最大值。如果当前元素大于当前最大值,就更新最大值。
  3. 异常处理:为了确保程序的健壮性,我们检查数组是否为空,并在为空时抛出异常,防止运行时错误。

这个方法的时间复杂度为 O(n),其中 n 是数组的长度,适用于各种规模的数组。理解这样基本的查找算法是学习编程的重要一步,也为将来实现更复杂的算法打下了基础。