青训营X豆包MarsCode 技术训练营第八课 | 豆包MarsCode AI 刷题

60 阅读8分钟

制定刷题计划

  • 基础夯实期

    • 目标设定:熟练掌握基本的数据结构和简单算法,理解代码逻辑和解题思路,为后续复杂问题求解打基础。
    • 刷题范围:以数组、字符串操作、简单哈希表应用等相关题目为主。可以从在线刷题平台(如 LeetCode、牛客网)中筛选难度为简单的题目,也可以使用本题所属的 MarsCode AI 刷题功能中的基础题库。
    • 时间安排:每天安排 2 - 3 小时用于刷题。每次集中精力解决 3 - 5 道题,确保每道题都理解透彻,包括题目要求、解题思路、代码实现以及时间和空间复杂度分析。
    • 总结归纳:每完成 5 - 10 道题,对涉及的知识点进行总结,比如本题中哈希表的使用方式(putgetOrDefault 方法的应用)、字符遍历等。对比不同题目中相同知识点的不同应用场景,加深理解。
  • 能力提升期

    • 目标设定:开始接触中等难度题目,将多个知识点融合运用,提高解题能力和算法思维,学会分析问题的本质和选择合适的算法。
    • 刷题范围:拓展到包括搜索算法(BFS、DFS)、排序算法、更复杂的哈希表应用以及简单的动态规划入门题目等。可在刷题平台上选择中等难度题目,或者利用 MarsCode AI 刷题根据知识点推荐的中等难度练习。
    • 时间安排:每周抽出 3 - 4 天,每天 3 - 4 小时刷题。每次完成 4 - 6 道题,注意解题速度的提升,但不能忽视对题目细节的把握。
    • 总结归纳:针对错题和解题过程中遇到困难的题目进行详细分析,总结解题思路和知识点之间的关联,建立自己的解题模板。例如,对于搜索算法相关题目,总结其一般的代码结构和不同场景下的变化形式。同时,对新学习的知识点进行复习和巩固,通过查阅资料、观看讲解视频等方式加深理解。
  • 强化巩固期

    • 目标设定:攻克高难度题目,深入理解复杂算法原理和优化技巧,能够灵活应对各种变形题目,提高在限时条件下解决问题的能力。
    • 刷题范围:挑战高难度的算法竞赛真题、知名企业面试中的难题,以及一些具有创新性和综合性的题目。可参加线上的算法竞赛模拟赛或者使用 MarsCode AI 刷题中的高难度挑战模式。
    • 时间安排:每周安排 2 - 3 天,每天 4 - 5 小时用于高难度刷题。每次完成 2 - 3 道题,注重思考和分析,可能需要花费较长时间研究一道题的多种解法和最优解。
    • 总结归纳:整理高难度题目的解题思路和方法,形成自己的解题笔记。对经常出错或者理解困难的知识点进行专项突破,通过大量练习和深入学习来弥补知识漏洞。同时,关注算法领域的最新动态和新出现的题型,拓宽解题思路。

利用错题进行针对性学习

  • 错题整理

    • 分类存储:建立错题本,可以是电子文档或者纸质笔记本。按照知识点(如本题涉及的哈希表、字符处理等)、题型(计算出售商品数量类似的计数问题)、错误类型(算法思路错误、代码实现错误等)对错题进行分类。
    • 详细记录:对于每道错题,记录题目完整信息(包括输入输出示例、限制条件等)、自己的错误解法(附上错误思路和代码)、正确解法(详细的解题步骤和代码实现)以及错误原因分析(是对某个知识点不理解,还是粗心大意等)。
  • 定期复习与分析

    • 设定复习周期:每周安排专门的时间(如周末 2 - 3 小时)复习错题。按照错题分类依次回顾,重新做一遍错题,看是否能正确解答。
    • 深入分析错误原因:如果再次做错,仔细分析是之前的错误原因没有彻底解决,还是又出现了新的问题。对于仍然存在的知识漏洞,进行重点标记。
  • 针对性强化训练

    • 知识巩固:根据错题反映出的知识薄弱点,重新学习相关知识点。可以查阅教材、观看在线课程、阅读技术博客等,确保对知识点有清晰准确的理解。
    • 专项练习:针对薄弱知识点进行专项刷题训练。在刷题平台或者 MarsCode AI 刷题中搜索相关类型的题目,集中练习,直到熟练掌握,减少类似错误的再次发生。

工具运用

  • 与教材结合

    • 知识点学习:在使用 AI 刷题之前,先通过专业的算法教材系统学习数据结构和算法的基础知识。例如,学习哈希表时,从教材中了解其原理、实现方式、时间复杂度分析等内容。教材可以选择《算法导论》《数据结构与算法分析:Java 语言描述》等经典教材。
    • 刷题辅助:在刷题过程中,如果遇到对某个知识点理解模糊的情况,及时回到教材中查找相关内容进行复习。同时,教材中的例题和练习题可以作为补充练习,加深对知识点的理解和应用能力。例如,做完本题后,可以在教材中查找哈希表相关的练习题进行拓展练习。
  • 与在线课程配合

    • 课程学习:报名参加优质的在线算法课程,如 Coursera、edX 上的相关课程,或者国内的慕课网、网易云课堂上的算法课程。课程中的讲解和示例可以帮助你更好地理解复杂的知识点和解题思路。
    • 互动学习:在课程学习过程中,积极参与课程讨论区,与老师和其他同学交流解题经验和遇到的问题。同时,将 AI 刷题中遇到的难题带到课程中讨论,获取更多的思路和建议。例如,在学习搜索算法课程时,将刷题过程中关于 BFS 或 DFS 的难题分享出来,向老师和同学请教。
    • 课后巩固:利用 AI 刷题功能进行课后巩固练习,根据课程所学内容选择相应类型的题目进行强化训练。课程和刷题相互促进,提高学习效果。
  • 与技术论坛互动

    • 问题求解:在刷题过程中遇到困难或者对某个解法有疑问时,将问题发布到技术论坛(如 Stack Overflow、掘金、知乎等)上。详细描述问题背景、自己的思路和遇到的困难,向广大开发者和算法爱好者寻求帮助。例如,在对本题的解法有疑问或者想要优化解法时,可以在论坛上发起讨论。
    • 知识分享与交流:积极参与论坛上的算法讨论话题,分享自己在 AI 刷题过程中的解题经验、新学到的知识点和技巧。通过与其他用户的交流,从不同角度理解和掌握知识,拓宽解题思路。同时,关注论坛上的热门算法话题和优秀的解题分享,学习他人的经验和方法,提升自己的算法水平。

问题描述

在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:

  • n:货物架的格子数
  • m:顾客想要购买的商品种类数
  • s:货物架上商品的初始顺序
  • c:顾客想要购买的商品种类

测试样例

样例1:

输入:n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3

样例2:

输入:n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2

样例3:

输入:n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4

答案:

public class Main {
    public static int solution(int n, int m, String s, String c) {
        // 统计货架上每种商品的数量
        HashMap<Character, Integer> shelfCount = new HashMap<>();
        for (char item : s.toCharArray()) {
            shelfCount.put(item, shelfCount.getOrDefault(item, 0) + 1);
        }

        // 统计顾客想要的商品种类
        HashMap<Character, Integer> customerCount = new HashMap<>();
        for (char item : c.toCharArray()) {
            customerCount.put(item, customerCount.getOrDefault(item, 0) + 1);
        }

        // 计算最多能卖出的商品数量
        int totalSales = 0;
        for (char item : customerCount.keySet()) {
            if (shelfCount.containsKey(item)) {
                totalSales += Math.min(shelfCount.get(item), customerCount.get(item));
            }
        }

        return totalSales;
    }

    public static void main(String[] args) {
        System.out.println(solution(3, 4, "abc", "abcd") == 3);
        System.out.println(solution(4, 2, "abbc", "bb") == 2);
        System.out.println(solution(5, 4, "bcdea", "abcd") == 4);
    }
}