掘金刷题之路 Day 5 | 豆包MarsCode AI刷题

212 阅读7分钟

功能亮点:云端编辑器与智能提示在刷题过程中的应用

在算法学习的道路上,实践是巩固知识、提高技能的关键。然而,传统的刷题方式往往需要在本地环境中编写、调试代码,这不仅耗时,而且可能会因为环境配置问题而影响学习效率。AI 刷题平台的云端编辑器,为我们提供了一个随时随地编写和运行代码的便捷环境。它集成了编译、运行、调试等功能,无需任何本地配置,打开网页即可开始编程。

智能提示是另一个亮点功能。在编写代码的过程中,云端编辑器会根据你的输入实时提供代码补全、语法纠错等提示。这不仅加快了编码速度,还能帮助我们及时发现代码中的潜在错误,培养良好的编程习惯。

刷题实践:SQL代码补全功能

思路
  1. 核心思路
    • 从已知词库中筛选匹配用户输入前缀的字符串。
    • 需要去重、排序,并处理无匹配结果的情况。
  1. 解法要点
    • 使用 TreeSet 自动去重和排序。
    • 遍历词库时利用字符串的 startsWith 方法筛选。
    • 最终输出满足条件的候选词,如果无结果则返回 -1
代码详解
  • 使用 TreeSet:排序与去重同时实现。
  • 字符串拼接:利用 String.join 输出逗号分隔的结果。
  • 无匹配项:通过判断 TreeSet 是否为空返回 -1
AC代码
import java.util.*;

public class Main {
    public static String solution(int num, String[] data, String input) {


     Set<String> result =  new TreeSet<>();

     for(String s:data){
        if(s.startsWith(input)){
            result.add(s);
        }
     }

     if(result.isEmpty()){
        return "-1";
     }

     return String.join(",",result);

    }

    public static void main(String[] args) {
        // 测试样例1
        String[] testData1 = {"select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"};
        System.out.println(solution(8, testData1, "f").equals("from,from_mobile")); // 输出: true
        
        // 测试样例2
        String[] testData2 = {"select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"};
        System.out.println(solution(16, testData2, "g").equals("group,group_id,group_name")); // 输出: true
        
        // 测试样例3
        System.out.println(solution(16, testData2, "m").equals("-1")); // 输出: true
        
        // 额外测试样例4
        System.out.println(solution(8, testData1, "origin").equals("origin_log_db")); // 输出: true
        
        // 额外测试样例5:输入为空字符串,应返回所有词汇按字典序排序
        System.out.println(solution(8, testData1, "").equals("event_log_table,from,from_mobile,limit,origin_log_db,select,user_id,where")); // 输出: true
        
        // 额外测试样例6:输入为整个词汇的一部分
        System.out.println(solution(8, testData1, "from_").equals("from_mobile")); // 输出: true
    }
}
构造回文字符串问题
思路
  1. 核心思路
    • 目标是找到一个字典序小于原字符串 s 的回文字符串。
    • 首先构造初始的回文字符串。
    • 如果构造的回文字符串不符合条件,则调整其字典序使其尽可能小但仍满足回文要求。
  1. 解法要点
    • 回文构造:根据字符串前半部分镜像构造。
    • 字典序调整:从中心向左寻找可减小的字符,并用 'z' 填充剩余部分。
    • 结果校验:若无法调整,返回 -1
代码详解
  • 回文构造:遍历字符串前半部分构造完整回文。
  • 字典序调整:从中间向左找到一个大于 'a' 的字符,并递减后重构回文。
  • 特殊情况:无法构造符合要求的回文时,返回 -1
AC代码
public class Main {
    public static String solution(String s) {
        int n = s.length();
        int mid = (n - 1) / 2;
        char[] t = new char[n];

        // 第一步:构造初始的回文字符串 t
        for (int i = 0; i <= mid; i++) {
            t[i] = s.charAt(i);
            t[n - 1 - i] = t[i];
        }

        String tStr = new String(t);
        // 第二步:比较 t 和 s
        if (tStr.compareTo(s) < 0) {
            return tStr;
        }

        // 第三步:调整 t 使其字典序变小
        boolean found = false;
        for (int i = mid; i >= 0; i--) {
            if (t[i] > 'a') {
                t[i]--;
                for (int j = i + 1; j <= mid; j++) {
                    t[j] = 'z';
                }
                // 将调整后的前半部分镜像到后半部分
                for (int j = 0; j <= mid; j++) {
                    t[n - 1 - j] = t[j];
                }
                found = true;
                break;
            }
        }

        // 第四步:检查是否存在有效的回文字符串
        if (!found) {
            return "-1";
        }
        tStr = new String(t);
        return tStr;
    }

    public static void main(String[] args) {
        System.out.println(solution("abc").equals("aba"));
        System.out.println(solution("cba").equals("cac"));
        System.out.println(solution("aaa").equals("-1"));
    }
}
结合两道题的总结与分析

两道题目虽然在问题背景和逻辑上不同,但核心上都涉及到:

  1. 字符串处理
    • 利用 startsWith 筛选前缀。
    • 利用回文特性(前后对称)构造特殊字符串。
  1. 集合与排序
    • SQL补全问题用 TreeSet 自动去重和排序。
    • 构造回文时,通过调整字符字典序保持结果有序。
  1. 异常处理
    • 无匹配项返回 -1
    • 无法构造符合要求的回文字符串同样返回 -1
知识总结

通过这两道题掌握的知识点:

  1. 字符串操作技巧
    • startsWith 用于前缀匹配。
    • compareTo 判断字符串字典序大小。
  1. 数据结构的选择
    • TreeSet 自动排序与去重的功能。
    • 灵活使用字符数组(如 char[])方便调整字符串内容。
  1. 算法优化
    • SQL补全直接使用集合工具类替代手动排序和去重。
    • 回文问题通过镜像技术减少复杂度。

学习建议:

  • 字符串相关题目重点掌握基本操作,如前缀匹配、回文判断、字典序比较。
  • 合理选择数据结构,能大幅优化代码逻辑和效率。

学习计划:结合两题设计高效刷题方法

每日刷题计划
  1. 按模块划分:每周专注一个领域(如字符串、数组、树、动态规划)。
  2. 每日目标:3 道中等难度题 + 1 道复杂题。
  3. 定期复盘:记录错题原因,总结易错点。
错题本的使用
  1. 分析错误类型:
    • 理解偏差:记录错因,重新学习相关知识。
    • 代码实现问题:列举优化方案。
  1. 针对性补强:将错题归类后,集中练习同类型题目。
时间管理
  1. 早上:用 30 分钟复习前一天的错题。
  2. 中午:练习两道题,巩固新知识。
  3. 晚上:挑战复杂题,并整理当日总结。

工具运用:结合 AI 刷题与学习资源

  1. AI刷题平台(如豆包MarsCode AI)
    • 根据题目标签分类刷题。
    • 使用 AI 的解析功能理解复杂逻辑。
    • 对比 AI 提供的标准解法优化自己的代码。
  1. 其他资源整合
    • 使用AI刷题或牛客网补充更多题库。
    • 阅读经典算法书籍(如《算法导论》)理解基础理论。
    • 观看视频讲解(如 B 站)快速上手难题。
  1. 结果输出
    • 将每日总结整理成文档(如 Markdown)。
    • 上传到掘金形成知识库。

AI 刷题平台的优势:

  • 实时反馈: 在云端编辑器中运行代码,可以立即看到输出结果,方便验证算法的正确性。
  • 智能提示: 编辑器根据上下文提供代码补全和语法检查,减少了编码过程中的低级错误。
  • 随时随地: 无需安装任何软件,打开浏览器即可开始编程,非常适合碎片化时间的学习。

学习收获:

通过这次实践,我深刻体会到逻辑思维在算法解题中的重要性。对于复杂的问题,理清思路,分步解决,才能找到最优解。

云端编辑器和智能提示功能,提高了我的编码效率,减少了调试时间。同时,AI 刷题平台的便捷性,使我能够更加专注于算法本身的学习与思考。

总结:

算法的学习离不开大量的实践,而一个好的工具能够事半功倍。AI 刷题平台的云端编辑器与智能提示,为我们提供了一个高效的编程环境。在这个平台上,我不仅提高了编程技能,更培养了良好的编码习惯和逻辑思维能力。