问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 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]
解题思路
-
数据结构选择:
- 使用字典来统计每种牌面值的数量。
- 使用列表来存储牌面值,并进行排序。
-
算法步骤:
-
统计每种牌面值的数量。
-
对牌面值进行排序,从大到小,特别注意A的牌面值为14(而不是1)。
-
遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合:
- 首先尝试找到三张相同牌面值的牌。
- 然后尝试找到两张相同牌面值的牌。
- 检查组合的牌面值之和是否不超过给定的最大值。
- 同时还要注意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}));
}
}
个人总结
- 数组初始化:我们定义了一个数组来存储葫芦大小的数据。
- 找出最大值:通过遍历整个数组,我们比较每个元素来找到最大值。如果当前元素大于当前最大值,就更新最大值。
- 异常处理:为了确保程序的健壮性,我们检查数组是否为空,并在为空时抛出异常,防止运行时错误。
这个方法的时间复杂度为 O(n),其中 n 是数组的长度,适用于各种规模的数组。理解这样基本的查找算法是学习编程的重要一步,也为将来实现更复杂的算法打下了基础。