链接: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 };
}
}
问题和改进建议
-
统计牌面出现次数的逻辑错误:
- 在统计牌面出现次数时,
hashMap.getOrDefault(array[i], 1) == 1
这个条件是错误的。getOrDefault
方法返回的是默认值,而不是当前值。 - 应该直接使用
hashMap.put(array[i], hashMap.getOrDefault(array[i], 0) + 1);
来统计牌面出现次数。
- 在统计牌面出现次数时,
-
不必要的
arrayList
初始化:ArrayList<Integer> arrayList = new ArrayList<Integer>();
和arrayList.add(1);
以及for (int i = 13; i > 1; i--) { arrayList.add(i); }
这部分代码是多余的,没有实际用途。
-
keySet
的使用:Set<Integer> keySet = hashMap.keySet();
这行代码没有实际用途,可以直接在遍历时使用hashMap.keySet()
。
-
测试用例的输出:
- 测试用例的输出部分使用了
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 给的思路进行思考和实现,如果发现还是不对的话可以获取对应的代码。大大加快了刷题的速度和质量,不用再像以前一样卡壳半天最后上网找题解草草了事!