简单题:最大葫芦 |豆包MarsCode AI 刷题

70 阅读3分钟

题目

寻找最大葫芦(代码练习 — 豆包 MarsCode

题目内容

德州扑克中的一种牌型葫芦:

  1. 对于数组元素中找出 三张一样的和另外两张相同的牌面。
  2. 对于大小的判断 : 优先判断三张的牌面后判断两张的牌面。(A数值上为1但是是所有牌面最大的)
  3. 对于牌面的总和也存在限制 < 所给定的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 存在特殊判定,所以先对中是否存在1 进行条件判定。
    2. 不存在1 则进行正常的遍历判断
  2. 葫芦相同牌面统计

    1. 创建两个不同的lsit数组存放出现3 or 2 次的牌面。
    2. 对于两个集合进行排序lsit(方便后续的遍历)
  3. 开始遍历

    1. 如果有三张直接固定为1 对Two 集合进行最大对子的遍历 (因为是扑克牌不可能出现5张牌,只需每次向后遍历即可)

      Two 中可能也会记录 1 所以对于Three 和Two中的1 进行特判返回[0,0]

    2. Three集合中不存在 1 => 正常遍历

    3. 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官网直接查询。