小C点菜问题| 豆包MarsCode AI 刷题

130 阅读5分钟

深度解析

问题理解

题目要求小C在餐馆中点一些价格相同的菜,但价格不能超过给定的上限 m。我们需要找出在满足这个条件下,小C最多可以点多少道菜。

数据结构选择

  • HashMap: 用于统计每个价格的菜品数量。选择 HashMap 的原因是它可以快速地进行插入和查找操作,适合用于统计和查找元素的数量。

算法步骤

  1. 遍历菜品价格数组:对于每个菜品价格,如果价格不超过 m,则在 HashMap 中统计该价格的菜品数量。
  2. 找出最多的菜品数量:遍历 HashMap 中的值,找出最大的菜品数量。

代码详解

import java.util.HashMap;

public class Main { public static long solution(int m, int[] w) { HashMap<Integer, Integer> countMap = new HashMap<>();

    // 统计每个价格的菜品数量
    for (int price : w) {
        if (price <= m) {
            countMap.put(price, countMap.getOrDefault(price, 0) + 1);
        }
    }

    // 找出最多的菜品数量
    int maxCount = 0;
    for (int count : countMap.values()) {
        maxCount = Math.max(maxCount, count);
    }

    return maxCount;
}

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. 初始状态

    • m = 6
    • w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
    • countMap 为空
  2. 遍历菜品价格数组

    • 价格 2countMap = {2: 1}
    • 价格 3countMap = {2: 1, 3: 1}
    • 价格 3countMap = {2: 1, 3: 2}
    • 价格 6countMap = {2: 1, 3: 2, 6: 1}
    • 价格 6countMap = {2: 1, 3: 2, 6: 2}
    • 价格 6countMap = {2: 1, 3: 2, 6: 3}
    • 价格 9 和 23 超过 m,不统计
  3. 找出最多的菜品数量

    • countMap.values() = [1, 2, 3]
    • maxCount = 3

总结知识点

  • HashMap的使用:用于快速统计和查找元素的数量。
  • 数组遍历:通过遍历数组来统计每个元素的出现次数。
  • 最大值查找:通过遍历 HashMap 的值来找出最大值。

学习建议

  1. 理解HashMap:HashMap是Java中非常常用的数据结构,理解其基本操作(如 putgetgetOrDefault)对于解决这类问题非常有帮助。
  2. 数组操作:熟练掌握数组的遍历和基本操作,这是解决许多算法问题的基础。
  3. 问题分解:将复杂问题分解为几个简单的步骤,逐步解决,有助于理清思路。

个人理解

这道题目通过简单的统计和查找操作,考察了基础的数据结构和算法知识。通过使用 HashMap 来统计菜品数量,可以高效地解决问题。对于初学者来说,这是一个很好的练习题目,可以帮助理解如何使用 HashMap 和数组来解决实际问题。

对其他入门同学的学习建议

  1. 多练习:通过解决类似的题目,加深对数据结构和算法的理解。
  2. 理解代码:不仅要会写代码,还要理解代码背后的逻辑和原理。
  3. 查漏补缺:如果对某个知识点不熟悉,及时查阅资料或请教他人,确保基础扎实。

高效学习方法总结

制定刷题计划

  1. 明确目标

    • 确定你想要达到的目标,例如提高算法能力、准备面试、通过某个考试等。
    • 设定具体的目标,如每天刷多少题,每周完成多少个主题等。
  2. 分阶段学习

    • 基础阶段:从简单的题目开始,熟悉基本的数据结构和算法,如数组、链表、栈、队列、排序和查找等。
    • 进阶阶段:逐步增加难度,学习更复杂的算法和数据结构,如动态规划、图算法、树的遍历等。
    • 冲刺阶段:针对特定目标进行专项训练,如面试题、竞赛题等。
  3. 制定计划

    • 每日计划:每天安排固定的时间进行刷题,保持持续性。
    • 每周计划:每周设定一个主题,集中学习相关的题目和知识点。
    • 长期计划:设定一个长期目标,如在三个月内完成某个算法课程或通过某个考试。
  4. 多样化练习

    • 不同平台:利用不同的在线平台(如LeetCode、Codeforces、牛客网等)进行练习,接触不同类型的题目。
    • 不同语言:尝试用不同的编程语言解决问题,提高语言的熟练度。

利用错题进行针对性学习

  1. 记录错题

    • 建立一个错题本,记录每次做错的题目,包括题目描述、错误原因、正确解法等。
  2. 分析错误原因

    • 粗心错误:记录并提醒自己避免类似的粗心错误。
    • 知识点不熟悉:针对不熟悉的知识点进行专项学习。
    • 算法理解不透彻:重新学习相关算法,理解其原理和应用场景。
  3. 定期复习

    • 每日复习:每天花几分钟复习前一天的错题。
    • 每周总结:每周总结一次错题,找出共性问题,进行针对性学习。
    • 定期回顾:每隔一段时间(如一个月)回顾所有错题,确保不再犯同样的错误。
  4. 针对性练习

    • 相似题目:找到与错题相似的题目进行练习,巩固知识点。
    • 专项训练:针对某个薄弱环节进行专项训练,如动态规划、图算法等。
  5. 讨论与分享

    • 讨论:与同学或朋友讨论错题,听取不同的解题思路。
    • 分享:在社区或论坛上分享你的错题分析,帮助他人也帮助自己加深理解。