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

123 阅读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"

解题思路

本题的核心思路是先统计每个棋子序号出现的次数,然后检查这些次数是否都能被 5 整除。如果所有序号对应的棋子数量都能被5整除,那就意味着可以按照每组5个且组内序号相同的规则对棋子进行分组。反之,只要有一个序号对应的棋子数量不能被5整除,就无法完成这样的分组。通过使用 HashMap 来方便地记录和查询每个序号的棋子数量情况,来实现判断分组是否可行的目的。

因此本题我们可以分为两个大步骤: 1.统计每个序号棋子数量

创建一个 HashMap<Integer, Integer> 类型的 countMap,其中键(Integer 类型)用于存放棋子的序号,值(也是 Integer 类型)用于记录对应序号的棋子数量。

遍历给定的整数数组 nums(数组中的元素代表棋子的序号),对于每个元素 num。通过用 countMap.put(num, countMap.getOrDefault(num, 0) + 1) 语句来更新 countMap 中对应序号的棋子数量。countMap.getOrDefault(num, 0) 这部分会先尝试获取 num 对应的当前数量,如果 num 不存在于 countMap 中(即首次出现),则返回默认值0,然后将这个获取到的值加1后再通过 put 方法更新 countMap 中 num 对应的数量,这样就完成了对每个序号棋子数量的统计。

2.检查棋子数能否被5整除

通过 for (int count : countMap.values()) 循环遍历 countMap 中所有的值(即每个序号对应的棋子数量)。

而对于其中的每个 count 值,判断 if (count % 5!= 0),如果发现有某个序号对应的棋子数量除以5的余数不为 0,即不能被5整除,那就意味着无法按照要求进行分组,此时直接返回 "False"。 如果遍历完所有的 count 值后,都没有发现不能被5整除的情况,说明所有序号的棋子数量都满足分组要求,返回 "True",表示可以按照规则对棋子进行分组。

其主要代码为: 1732807950430.png 通过上述代码,我们能够依据给与的飞行棋棋子序号数组,按照每组5个且组内序号相同的分组规则,准确判断是否可以对棋子进行分组。利用 HashMap 高效地统计了各序号棋子的数量,再通过简单的取余判断逻辑确定分组的可行性。主函数中的测试用例展示了函数在不同输入情况下的预期表现,初步验证了函数功能的正确性,这种实现方式适用于解决此类涉及根据元素出现频次判断能否按特定规则分组的问题。