寻找最大葫芦

113 阅读3分钟

import java.util.Arrays;

public class Main { public static int[] solution(int n, int max, int[] array) { // Edit your code here //先统计每种牌的数量 3张以上可以做葫芦的两种牌型 2张只能做为1种 //a3+b2<=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 + i2 <= 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 && i3 + l2 <= max)//找到符合条件的 { System.out.println(i3 + l2); 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}));
}

}

这段Java代码实现了一个寻找最大“葫芦”组合的算法。“葫芦”是一种特殊的牌型,由三张相同面值的牌和两张相同面值的牌组成,且这两组牌的面值不同。代码的目标是找到这样的组合,并返回这两组牌的面值;如果找不到符合条件的组合,则返回[0, 0]。

下面是代码的详细解释:

首先,代码定义了一个solution函数,它接受三个参数:n(牌的数量),max(牌面值之和的最大值),以及array(一个整数数组,表示牌的面值)。

在函数内部,首先创建了一个长度为14的数组a,用于统计每种面值的牌出现的次数。数组的索引代表牌的面值,从1到13(假设A是1,K是13)。

然后,通过一个循环遍历array,增加相应面值在a数组中的计数。

接下来,代码尝试找到可以作为“葫芦”中三张相同牌的面值。首先检查面值为1的牌是否至少有3张,如果是,则1可以作为三张牌的面值。

如果1不能作为三张牌的面值,代码会从面值13开始向下遍历,寻找至少有3张的面值,并且这个面值与面值为1的牌组合后不超过max。

如果找到了符合条件的三张牌的面值,代码会继续寻找两张牌的面值。如果三张牌的面值是1,那么两张牌的面值必须是1以外的其他面值,并且两张牌的面值与三张牌的面值组合后不超过max。

如果没有找到符合条件的三张牌的面值,代码会尝试找到两个不同的面值,使得一个面值至少有3张牌,另一个面值至少有2张牌,并且这两个面值的组合不超过max。

最后,如果找到了符合条件的“葫芦”组合,函数返回一个包含这两个面值的数组;如果没有找到,返回[0, 0]。

在main函数中,提供了一个测试用例,并打印了结果。