题解-小c点菜问题|豆包MarsCode AI刷题

85 阅读3分钟

问题分析

给定一个整数 m 和一个菜品价格数组 w,我们需要:

  1. 筛选出数组中所有不超过 m 的价格。
  2. 统计这些价格的出现频率。
  3. 返回出现次数最多的价格的频率。

整体思路

  1. 过滤价格:首先,我们需要从 w 中筛选出所有小于或等于 m 的价格。
  2. 统计频率:使用 HashMap 来统计每个价格出现的次数。HashMap 的键是价格,值是该价格出现的次数。
  3. 计算最大频率:遍历 HashMap 的值,找到出现次数最多的那个频率。
  4. 返回结果:返回最大频率。

代码解析

java
public class Main {
    public static long solution(int m, int[] w) {
        // 创建一个HashMap来统计每个价格出现的频率
        HashMap<Integer, Integer> priceCount = new HashMap<>();
  • 这里创建了一个 HashMap 对象 priceCount,用来存储每个价格的出现频率。HashMap 的键(key)是菜品的价格,值(value)是该价格的出现次数。
java
        // 遍历菜品价格数组
        for (int price : w) {
            // 如果价格不超过m,则统计其频率
            if (price <= m) {
                // 更新HashMap中的频率
                priceCount.put(price, priceCount.getOrDefault(price, 0) + 1);
            }
        }
  • 遍历数组 w:通过增强型 for 循环遍历 w 数组中的每个元素(即菜品的价格)。
  • 筛选价格:如果当前价格 price 小于或等于 m,则将该价格计入 priceCount 中。
  • priceCount.getOrDefault(price, 0):如果 price 已经在 priceCount 中存在,返回其当前的出现次数;如果不存在,返回默认值 0。然后将这个值加 1,表示该价格出现了一次。
java
        // 初始化最大频率为0
        int maxCount = 0;
  • 这里初始化一个变量 maxCount 用来存储最大出现频率。初始值为 0
java
        // 遍历HashMap,找出最大频率
        for (int count : priceCount.values()) {
            if (count > maxCount) {
                maxCount = count;
            }
        }
  • 遍历 priceCount 中的值priceCount.values() 返回一个包含所有频率值的集合。
  • 更新最大频率:如果当前频率 count 大于 maxCount,则更新 maxCount 为 count
java
        // 返回最大频率
        return maxCount;
    }
  • 最后,返回 maxCount,即出现次数最多的价格的频率。

main 方法

java
    public static void main(String[] args) {
        System.out.println(solution(6, new int[]{2, 3, 3, 6, 6, 6, 9, 9, 23}) == 3);
        System.out.println(solution(4, new int[]{1, 2, 4, 4, 4}) == 3);
        System.out.println(solution(5, new int[]{5, 5, 5, 5, 6, 7, 8}) == 4);
    }
  • 测试用例

    1. solution(6, new int[]{2, 3, 3, 6, 6, 6, 9, 9, 23}):在价格小于或等于 6 的价格中,6 出现 3 次,因此返回 3
    2. solution(4, new int[]{1, 2, 4, 4, 4}):在价格小于或等于 4 的价格中,4 出现 3 次,因此返回 3
    3. solution(5, new int[]{5, 5, 5, 5, 6, 7, 8}):在价格小于或等于 5 的价格中,5 出现 4 次,因此返回 4

图解

  1. 输入:假设我们有 m = 6 和 w = {2, 3, 3, 6, 6, 6, 9, 9, 23}

  2. 步骤 1:筛选出不超过 6 的价格:{2, 3, 3, 6, 6, 6}

  3. 步骤 2:统计这些价格的频率:

    • 2 出现 1 次
    • 3 出现 2 次
    • 6 出现 3 次
  4. 步骤 3:找出出现次数最多的价格,即 6,其频率为 3。

  5. 输出:返回最大频率 3

复杂度分析

  1. 时间复杂度O(n),其中 n 是数组 w 的长度。我们需要遍历一次数组来统计价格的频率,再遍历一次 HashMap 来找出最大频率。由于遍历是线性的,因此总时间复杂度是 O(n)
  2. 空间复杂度O(k),其中 k 是不超过 m 的不同价格的数量。在最坏的情况下,k 可以等于 n,即每个价格都不同,因此空间复杂度为 O(n)

总结

  • 这段代码通过 HashMap 高效地统计每个价格的出现频率,并找出出现次数最多的价格。
  • 使用 HashMap 的好处在于能够快速查找和更新频率,确保了代码的高效性。
  • 代码逻辑清晰,适用于计算数组中频率最高的元素,特别是在筛选条件下(即价格不超过 m)。