问题描述
现在桌子上有一堆飞行棋棋子,有 N
个,每个棋子上标有数字序号,现在想让你帮忙给这堆飞行棋分成 M
组,需要满足:
- 每个分组只能包含 5 个棋子
- 每个棋子只能出现在一个分组里
- 每个分组里的棋子的数字序号相同
请问可以完成上述分组么?
输入格式
空格分割的飞行棋棋子序号,如:1 3 4 5 6 5 4
输出格式
是否可以完成分组,如果可以输出 true
,否则输出 false
输入样例(1)
1 2 3 4 5
上述棋子只有 5 个只能分为一组,但组内棋子序号不一致,所以无法完成分组,输出 false
输出样例(2)
1 1 1 1 2 1 2 2 2 2
上述棋子可以分为两组,[1, 1, 1, 1, 1]
和 [2, 2, 2, 2, 2]
两组,可以完成分组,输出 true
数据范围
- 棋子数量:
1 <= N <= 10^5
- 棋子序号:
1 <= pieces[i] <= 40
代码解析如下
import java.util.HashMap;
import java.util.Map;
public class Main {
public static String solution(int[] nums) {
// 使用HashMap统计每个数字出现的次数
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
// 遍历map,检查每个数字出现的次数是否为5的倍数
for (int count : countMap.values()) {
if (count % 5 != 0) {
return "False";
}
}
// 如果所有数字的出现次数都是5的倍数,则可以完成分组
return "True";
}
public static void main(String[] args) {
// You can add more test cases here
System.out.println(solution(new int[]{1, 3, 4, 5, 6, 5, 4}).equals("False"));
System.out.println(solution(new int[]{1, 1, 1, 1, 2, 1, 2, 2, 2, 2}).equals("True"));
System.out.println(solution(new int[]{11, 45, 49, 37, 45, 38, 3, 47, 35, 49, 26, 16, 24, 4, 45, 39, 28, 26, 14, 22, 4, 49, 18, 4, 4, 26, 47, 14, 1, 21, 9, 26, 17, 12, 44, 28, 24, 24, 10, 31, 33, 32, 23, 41, 41, 19, 17, 24, 28, 46, 28, 4, 18, 23, 48, 45, 7, 21, 12, 40, 2, 19, 19, 28, 32, 6, 27, 43, 6, 18, 8, 27, 9, 6, 6, 31, 37, 15, 26, 20, 43, 3, 14, 40, 20}).equals("False"));
}
}