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 && i3 + 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}));
}
}
题解:
该代码的目的是解决一个牌型组合问题,判断在给定的牌面情况下,能否形成一种特定的组合,即葫芦(Full House)。葫芦由一组三张相同点数的牌和一组两张相同点数的牌组成。代码的目标是从手中的牌中选出合适的点数组合以满足葫芦的条件,并且这一组合的总点数不超过给定的最大值 max。
主要步骤:
- 统计牌的数量: 使用数组
a来统计每种牌(1至13点)的数量。 - 识别三张和两张的牌型:
- 首先检查有没有“1”点的牌,如果“1”点的牌数量大于等于三张,则可以将“1”和另一种牌结合形成葫芦:
- 遍历13点到2点,寻找足够数量的非“1”点的牌(至少两张)。
- 如果没有足够数量的“1”点的牌(少于三张),就只能寻找其他非“1”的牌来形成葫芦:
- 优先寻找点数较大的牌(至少三张)结合“1”点的牌(至少两张),然后再尝试组合其他的两种不同点数的牌。
- 首先检查有没有“1”点的牌,如果“1”点的牌数量大于等于三张,则可以将“1”和另一种牌结合形成葫芦:
- 判断并返回结果:
- 确定成功形成的牌型后,返回两个点数的数组
[j, k],表示组成葫芦的牌点;若未能形成葫芦,则返回[0, 0]。
- 确定成功形成的牌型后,返回两个点数的数组
代码逻辑:
int[] a = new int[14];用于存储点数为1到13的牌的数量。a[0]的位置没有使用。for(i = 0; i < n; i++)统计数组array中的每种牌数量。- 逐步判断是否能够找到合适的点数组合形成葫芦,并在条件满足的情况下返回结果。
分析复杂度:
- 时间复杂度大体上是O(n + m²),其中n是牌的数量,m是不同点数的牌(最多为13),因为我们要遍历每个点数来寻找合适的组合。
测试情况:
主函数内提供了一组示例数据,使用 Arrays.toString() 打印输出结果。可以进行多组测试,以确保程序正确处理各种牌的组合情况,和判断条件的合理性。
注意:
- 程序未必能处理完整的异常情况,如输入的
array数组中的牌点数超出1到13的范围(在实际应用中需进行适当校验)。 - 代码中有一些注释掉的调试输出可以用于接下来的调试和验证。
这样通过有条理地组织步骤和代码逻辑,可以帮助读者更好地理解如何实现该功能以及它的运作方式。