SQL代码补全功能-青训营X豆包MarsCode 技术训练营刷题分享 | 豆包MarsCode AI 刷题

56 阅读4分钟

一、题目解析:

问题描述

在开发SQL编辑器时,实现自动补全功能是提高用户体验的重要一环。需要实现一个功能,根据用户输入的字符片段,快速从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。

例如,当用户输入 s 时,编辑器需要自动提示以 s 开头的所有可能选项,如 select。如果用户输入 fr,则需要提示 from 和 from_mobile。如果在提示中只有一个选项符合,如输入 from_ 时只提示 from_mobile

输入

  • num: 关键字和数据库相关名称的数量
  • data: 包含所有关键字和数据库相关名称的数组
  • input: 用户输入的字符片段

返回

  • 以输入片段开头的所有候选词,按字典序输出。如果没有符合的候选词,则返回 -1

参数限制

  • 1 <= num <= 10^4
  • data 中的每个字符串长度不超过 100
  • input 的长度不超过 100

题目思路

  1. 初始化变量:创建一个 TreeSet 用于存储符合条件的候选词,并自动去重和排序。
  2. 遍历数据:遍历 data 数组,检查每个字符串是否以 input 开头。
  3. 添加候选词:如果字符串以 input 开头,则将其添加到 TreeSet 中。
  4. 生成结果:将 TreeSet 中的元素按字典序拼接成一个字符串,返回结果。如果 TreeSet 为空,则返回 -1

具体操作步骤

  1. 初始化变量

    • 创建一个 TreeSet 用于存储符合条件的候选词。
  2. 遍历数据

    • 遍历 data 数组,检查每个字符串是否以 input 开头。
  3. 添加候选词

    • 如果字符串以 input 开头,则将其添加到 TreeSet 中。
  4. 生成结果

    • 将 TreeSet 中的元素按字典序拼接成一个字符串,返回结果。如果 TreeSet 为空,则返回 -1

代码实现

 public static String solution(int num, String[] data, String input) {
    int inputLength = input.length(); // 获取输入字符串的长度
    String[] result = new String[num]; // 创建一个数组用于存储匹配的结果
    int flag = 0; // 计数器,用于记录匹配的结果数量

    // 查找匹配的字符串
    for (String Ob : data) {
        int isSub = 1; // 标志变量,初始值为1,表示当前字符串匹配
        for (int i = 0; i < inputLength && i < Ob.length(); i++) {
            // 如果当前字符不匹配,则设置标志变量为0,并退出循环
            if (input.charAt(i) != Ob.charAt(i)) {
                isSub = 0;
                break;
            }
        }
        // 如果字符串匹配并且长度大于等于输入字符串长度,则将其添加到结果数组中
        if (isSub == 1 && Ob.length() >= inputLength) {
            result[flag] = Ob;
            flag++;
        }
    }

    // 使用 TreeSet 去重并排序
    TreeSet<String> set = new TreeSet<>();
    for (int i = 0; i < flag; i++) {
        set.add(result[i]);
    }

    // 将 TreeSet 转换为数组
    String[] validResults = set.toArray(new String[set.size()]);
    StringBuffer res = new StringBuffer();

    flag = validResults.length; // 更新 flag 为有效结果的数量
    if (flag == 0) {
        res.append("-1"); // 如果没有匹配结果,返回 -1
    }
    for (int i = 0; i < flag; i++) {
        res.append(validResults[i]); // 将有效结果添加到结果字符串中
        if (i != flag - 1) {
            res.append(","); // 在结果之间添加逗号
        }
    }
    return res.toString(); // 返回最终结果字符串
}

二、知识总结:字符串操作和集合的应用

Java 中的 TreeSet 用法

  • 特性TreeSet 是一个有序的集合,基于红黑树实现,具有自动排序和去重功能。

  • 常用方法

    • add(E e): 将指定的元素添加到此集合中。
    • isEmpty(): 如果此集合不包含任何元素,则返回 true
    • iterator(): 返回此集合中元素的迭代器。

字符串操作

  • 特性:字符串是不可变的字符序列,每次修改都会生成新的字符串对象。
  • 实际应用:字符串操作常用于文本处理、数据解析等场景。

集合

  • 特性:集合用于存储一组不重复的元素,常用于去重和快速查找。
  • 实际应用:集合广泛应用于数据处理、算法实现等场景。

学习建议

  • 多练习类似的题目:尝试解决更多涉及字符串操作和集合的问题,如“最长回文子串”、“字符串反转”等。
  • 理解并手动推导:手动推导集合操作的过程,直观感受其工作原理和性能特点。
  • 阅读相关文档和教程:深入学习字符串操作和集合的实现细节和使用方法。

通过这些方法,可以更好地掌握字符串操作和集合的应用,提升算法设计和实现的能力。