分组飞行棋棋子 | 豆包MarsCode AI刷题

30 阅读3分钟

问题描述

小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" 好的,以下是关于这个问题的笔记:

关键点

  1. 输入:一个包含 N 个整数的列表 nums,表示棋子的序号。

  2. 输出:一个字符串 "True" 或 "False",表示是否可以按照要求分组。

  3. 分组要求

    • 每组恰好5个棋子。
    • 组内棋子的序号相同。

解题思路

  1. 统计每个数字的出现次数

    • 使用 collections.Counter 来统计每个数字在列表中出现的次数。
  2. 检查每个数字的出现次数是否是5的倍数

    • 遍历 Counter 中的每个键,检查其对应的值是否是5的倍数。
    • 如果不是5的倍数,则返回 "False"
  3. 返回结果

    • 如果所有数字的出现次数都是5的倍数,则返回 "True"

代码实现

    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 是不同数字的数量。