问题描述
小M和小F在玩飞行棋。游戏结束后,他们需要将桌上的飞行棋棋子分组整理好。现在有 N
个棋子,每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M
组,每组恰好5个,并且组内棋子的序号相同。小M希望知道是否可以按照这种方式对棋子进行分组。
例如,假设棋子序号为 [1, 2, 3, 4, 5]
,虽然只有5个棋子,但由于序号不同,因此不能形成有效的分组。如果序号是 [1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
,则可以形成两个有效分组,因此输出为 True
。
测试样例
样例1:
输入:
nums = [1, 2, 3, 4, 5]
输出:"False"
样例2:
输入:
nums = [1, 1, 1, 1, 2, 1, 2, 2, 2, 2]
输出:"True"
样例3:
输入:
nums = [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
输出:"True"
样例4:
输入:
nums = [7, 7, 7, 8, 8, 8, 8, 8, 7, 7]
输出:"True"
样例5:
输入:
nums = [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
输出:"False"
好的,以下是关于这个问题的笔记:
关键点
-
输入:一个包含
N
个整数的列表nums
,表示棋子的序号。 -
输出:一个字符串
"True"
或"False"
,表示是否可以按照要求分组。 -
分组要求:
- 每组恰好5个棋子。
- 组内棋子的序号相同。
解题思路
-
统计每个数字的出现次数:
- 使用
collections.Counter
来统计每个数字在列表中出现的次数。
- 使用
-
检查每个数字的出现次数是否是5的倍数:
- 遍历
Counter
中的每个键,检查其对应的值是否是5的倍数。 - 如果不是5的倍数,则返回
"False"
。
- 遍历
-
返回结果:
- 如果所有数字的出现次数都是5的倍数,则返回
"True"
。
- 如果所有数字的出现次数都是5的倍数,则返回
代码实现
from collections import Counter
# 统计每个数字出现的次数
count = Counter(nums)
# 检查每个数字的出现次数是否是5的倍数
for key in count:
if count[key] % 5 != 0:
return "False"
return "True"
if __name__ == "__main__":
# You can add more test cases here
print(solution([1, 3, 4, 5, 6, 5, 4]) == "False")
print(solution([1, 1, 1, 1, 2, 1, 2, 2, 2, 2]) == "True")
print(solution([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]) == "False")
总结
- 数据结构:使用
collections.Counter
来统计每个数字的出现次数。 - 算法:遍历
Counter
中的每个键,检查其对应的值是否是5的倍数。 - 时间复杂度:O(N),其中 N 是棋子的数量。
- 空间复杂度:O(K),其中 K 是不同数字的数量。