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

101 阅读3分钟

问题描述

现在桌子上有一堆飞行棋棋子,有 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

问题理解

我们需要将一堆飞行棋棋子分成若干组,每组包含5个棋子,并且每组内的棋子序号必须相同。如果可以完成这样的分组,则输出 true,否则输出 false

数据结构选择

为了高效地统计每个序号的棋子数量,我们可以使用一个 HashMap 来记录每个序号的棋子数量。

算法步骤

  1. 统计每个序号的棋子数量:遍历输入的棋子数组,使用 HashMap 记录每个序号的棋子数量。
  2. 检查是否可以分组:对于 HashMap 中的每个序号,检查其数量是否是5的倍数。如果不是,则无法完成分组,返回 false
  3. 返回结果:如果所有序号的棋子数量都是5的倍数,则返回 true
import java.util.HashMap;

public class Main {
    public static String solution(int[] nums) {
        // 使用HashMap统计每个序号的棋子数量
        HashMap<Integer, Integer> countMap = new HashMap<>();
        for (int num : nums) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }

        // 检查每个序号的棋子数量是否是5的倍数
        for (int count : countMap.values()) {
            if (count % 5 != 0) {
                return "False";
            }
        }

        // 如果所有序号的棋子数量都是5的倍数,则返回true
        return "True";
    }

    public static void main(String[] args) {
        // 测试用例
        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"));
    }
}

HashMap使用方法

一.添加与修改

添加使用put(key键名,value键值)或putAll(HashMap对象) 修改时在存在的键名上重新赋值即可

二.题目中HashMap使用方法

HashMap<Integer, Integer> countMap = new HashMap<>();

键名和键值都为整数型变量Integer

getOrDefault()获取指定键key对应对value,如果找不到,则返回设置的默认值

values()返回HashMap中存在的所有value。

遍历数组,使用 countMap.put(num, countMap.getOrDefault(num, 0) + 1);找到数组中相同的数字,并让当前数字的value+1.最后判断value值是否都是五的倍数,如果不是则返回False,反之则True。

总结

如果能熟练运用HashMap,那么这道题非常简单。感谢豆包AI给我解题思路,让我找到更简单的解题方式。