最大的葫芦 | 豆包MarsCode AI刷题

链接:www.marscode.cn/practice/5w...

思路:

首先是组合应该是3+2,也就是3个一样的加上2个一样的。这是最基本的要求

所以首先先遍历看看有没有符合基本条件的没有的话就直接返回

有的话再看看3+2最大的是否超过max

超过的话就寻找其他组合,没有的话就直接返回

考虑看看用什么数据类型去存储

考虑用一下map

先遍历获取每个牌出现的次数为value

再创建一个set为key的存储

创建一个从大到小的排序

依次判断是不是最大的组合的数值是不是大于max

思路有点卡壳

看看MarsCode AI 给的思路

排序和选择最大组合:对筛选出的牌面进行排序,从大到小。然后遍历这些牌面,寻找符合条件的最大组合

第一次过案例

没通过

ini 复制代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
​
public class Main {
    public static int[] solution(int n, int max, int[] array) {
        // Edit your code here
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        for (int i = 0; i < array.length; i++) {
            if (hashMap.getOrDefault(array[i], 1) == 1) {
                hashMap.put(array[i], 1);
            } else {
                hashMap.put(array[i], hashMap.get(array[i]) + 1);
            }
        }
​
        if (hashMap.size() <= 1) {
            return new int[] { 0, 0 };
        }
​
        Set<Integer> keySet = hashMap.keySet();
​
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        arrayList.add(1);
        for (int i = 13; i > 1; i--) {
            arrayList.add(i);
        }
​
        ArrayList<Integer> threeOfAKind = new ArrayList<>();
        ArrayList<Integer> twoOfAKind = new ArrayList<>();
​
        for (Integer key : hashMap.keySet()) {
            int count = hashMap.get(key);
            if (count >= 3) {
                threeOfAKind.add(key);
            }
            if (count >= 2) {
                twoOfAKind.add(key);
            }
        }
​
        // 对牌面进行排序,从大到小
        threeOfAKind.sort((a, b) -> b - a);
        twoOfAKind.sort((a, b) -> b - a);
​
        // 寻找符合条件的最大组合
        for (int three : threeOfAKind) {
            for (int two : twoOfAKind) {
                if (three != two && 3 * three + 2 * two <= max) {
                    return new int[] { three, two };
                }
            }
        }
​
        return new int[] { 0, 0 };
    }
}
​

问题和改进建议

  1. 统计牌面出现次数的逻辑错误

    • 在统计牌面出现次数时,hashMap.getOrDefault(array[i], 1) == 1 这个条件是错误的。getOrDefault 方法返回的是默认值,而不是当前值。
    • 应该直接使用 hashMap.put(array[i], hashMap.getOrDefault(array[i], 0) + 1); 来统计牌面出现次数。
  2. 不必要的 arrayList 初始化

    • ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(1); 以及 for (int i = 13; i > 1; i--) { arrayList.add(i); } 这部分代码是多余的,没有实际用途。
  3. keySet 的使用

    • Set<Integer> keySet = hashMap.keySet(); 这行代码没有实际用途,可以直接在遍历时使用 hashMap.keySet()
  4. 测试用例的输出

    • 测试用例的输出部分使用了 java.util.Arrays.equals,这是正确的,但可以简化代码。

改进后还需改变大小,1比13大

css 复制代码
// 对牌面进行排序,从大到小
        threeOfAKind.sort((a, b) -> b - a);
        twoOfAKind.sort((a, b) -> b - a);

修改后:

kotlin 复制代码
// 对牌面进行排序,从大到小
        threeOfAKind.sort((a, b) -> {
            if (a == 1) return -1; // A (1) 最大
            if (b == 1) return 1;  // A (1) 最大
            return b - a;
        });
​
        twoOfAKind.sort((a, b) -> {
            if (a == 1) return -1; // A (1) 最大
            if (b == 1) return 1;  // A (1) 最大
            return b - a;
        });

通过!嘿嘿嘿

刷题小总结:

在大体思路没问题,而在部分实现的时候卡壳时,可以看看MarsCode AI 给的思路。先根据MarsCode AI 给的思路进行思考和实现,如果发现还是不对的话可以获取对应的代码。大大加快了刷题的速度和质量,不用再像以前一样卡壳半天最后上网找题解草草了事!

相关推荐
柠檬柠檬4 小时前
Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题
青训营笔记
用户967136399654 小时前
计算最小步长丨豆包MarsCodeAI刷题
青训营笔记
用户529757993547220 小时前
字节跳动青训营刷题笔记2| 豆包MarsCode AI刷题
青训营笔记
clearcold1 天前
浅谈对LangChain中Model I/O的见解 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵2 天前
【字节青训营】 Go 进阶语言:并发概述、Goroutine、Channel、协程池 | 豆包MarsCode AI刷题
青训营笔记
用户336901104442 天前
数字分组求和题解 | 豆包MarsCode AI刷题
青训营笔记
dnxb1232 天前
GO语言工程实践课后作业:实现思路、代码以及路径记录 | 豆包MarsCode AI刷题
青训营笔记
用户916357440952 天前
AI刷题-动态规划“DNA序列编辑距离” | 豆包MarsCode AI刷题
青训营笔记
热的棒打鲜橙2 天前
数字分组求偶数和 | 豆包MarsCode AI刷题
青训营笔记
JinY142 天前
Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题
青训营笔记