题目
寻找最大葫芦(代码练习 — 豆包 MarsCode)
题目内容
德州扑克中的一种牌型葫芦:
- 对于数组元素中找出 三张一样的和另外两张相同的牌面。
- 对于大小的判断 : 优先判断三张的牌面后判断两张的牌面。(A数值上为1但是是所有牌面最大的)
- 对于牌面的总和也存在限制 < 所给定的max 。
测试样例
测试样例1
输入:n=9 ,max =34 ,arry=[6, 6, 6, 8, 8, 8, 5, 5, 1]
输出: [8,5]
测试样例2
输入:n=9 ,max =37 ,arry=[9, 9, 9, 9, 6, 6, 6, 6, 13]
输出: [6,9]
测试样例3
输入:n=9 ,max =40 ,arry=[1, 11, 13, 12, 7, 8, 11, 5, 6]
输出: [0,0]
思路分析
-
初始数据分析
- 对于1 存在特殊判定,所以先对中是否存在1 进行条件判定。
- 不存在1 则进行正常的遍历判断
-
葫芦相同牌面统计
- 创建两个不同的lsit数组存放出现3 or 2 次的牌面。
- 对于两个集合进行排序lsit(方便后续的遍历)
-
开始遍历
-
如果有三张直接固定为1 对Two 集合进行最大对子的遍历 (因为是扑克牌不可能出现5张牌,只需每次向后遍历即可)
Two 中可能也会记录 1 所以对于Three 和Two中的1 进行特判返回[0,0]
-
Three集合中不存在 1 => 正常遍历
-
Two再次进行判断 是否Two中存在1
-
存在 1 则对 三张的进行便利寻找 最大的三张
不存在 1 则 正常遍历
对于遍历中的max 判断增加 一个Summax 作为比较最大值的中间变量 。
但是因为对 list 数组已经拍过序 ,其实Summax 可以简化。
代码实现
public class Main {
public static int[] solution(int n, int max, int[] array) {
// Edit your code here
int preMax = 0; // 存储三张相同牌的最大值
int sufMax = 0; // 存储两张相同牌的最大值
int SumMax = 0;
java.util.ArrayList<Integer> Three = new java.util.ArrayList<>();
java.util.ArrayList<Integer> Two = new java.util.ArrayList<>();
int count = 1;
for (int i = 0; i < n; i++) {
count = 1;
for (int j = i + 1; j < n; j++) {
if (array[i] == array[j]) {
count++;
}
}
if (count == 2) {
Two.add(array[i]);
}
if (count == 3) {
Three.add(array[i]);
}
}
java.util.Collections.sort(Three, java.util.Collections.reverseOrder());
java.util.Collections.sort(Two, java.util.Collections.reverseOrder());
//打印两个lsit方便修改代码
for (Integer number : Three) {
System.out.print(number + " "); // 在每个整数后加一个空格
}
System.out.println();
for (Integer number : Two) {
System.out.print(number + " "); // 在每个整数后加一个空格
}
System.out.println();
//对于特殊条件判断
if (Three.contains(1)){
preMax =1 ;
for (int j : Two){
int sum = 3+ 2*j;
if (sum <=max && sum>=SumMax){
SumMax = sum;
sufMax =j ;} }
if (preMax == sufMax){ return new int []{0,0};}
return new int[] { preMax, sufMax };
}else {
if (Two.contains(1)){
sufMax =1 ;
for (int i :Three){
int sum = 3*i + 2 ;
if (sum <=max && sum>=SumMax){
SumMax = sum;
preMax =i ;} }
return new int[] { preMax, sufMax };
}else {
for (int i :Three){
for (int j : Two){
int sum = 3*i + 2*j;
if (i != j && sum <=max ){
preMax =i;
sufMax =j;
System.out.println(preMax);
System.out.println(sufMax);
return new int[] { preMax, sufMax }; }}}}}
return new int[] { preMax, sufMax };
}
使用的解法相当暴力,再此也没有必要谈论时间空间复杂度。
总结
题目难度不大,对于简单题很多题目甚至直写return逻辑即可,该题只进行最简单的思路分析。
有时可能对于自己的需求,java可能已经存在对应函数直接询问MarsCode 即可,对于更加详细的参数可以去JDK官网直接查询。