SQL代码补全功能解析| 豆包MarsCode AI刷题

187 阅读2分钟

问题描述

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

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

问题理解

你需要实现一个函数 solution,该函数接收三个参数:

  1. num:表示数据列表的长度。
  2. data:一个包含SQL关键字和数据库相关名称的列表。
  3. input:用户输入的字符片段。

函数的目标是根据用户输入的字符片段,从 data 列表中找到所有以该片段开头的候选词,并按字典序输出。如果只有一个候选词,则直接输出该词;如果没有匹配的候选词,则输出 -1

数据结构选择

  • 使用列表来存储候选词。
  • 使用字符串拼接来生成最终的输出结果。

算法步骤

  1. 过滤候选词:遍历 data 列表,筛选出所有以 input 开头的字符串。

  2. 排序:将筛选出的候选词按字典序排序。

  3. 生成输出

    • 如果筛选出的候选词列表为空,返回 -1
    • 如果筛选出的候选词列表只有一个元素,直接返回该元素。
    • 否则,将所有候选词用逗号连接成一个字符串并返回。

要点注意

如果代码没有去重,导致生成的候选词列表中包含了重复的元素,故在过滤候选词后,使用 set 来去重,然后再将结果转换回列表并排序。

代码

def solution(num, data, input):
    # 1. 过滤候选词并去重
    candidates = list(set(word for word in data if word.startswith(input)))
    
    # 2. 排序
    candidates.sort()
    
    # 3. 生成输出
    if not candidates:
        return '-1'
    elif len(candidates) == 1:
        return candidates[0]
    else:
        return ','.join(candidates)
​
if __name__ == "__main__":
    # 你可以添加更多测试用例
    testData1 = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"]
    testData2 = ["select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"]
​
    print(solution(8, testData1, "f") == "from,from_mobile")
    print(solution(16, testData2, "g") == "group,group_name,group_id")
    print(solution(16, testData2, "m") == "-1")
    print(solution(8, testData1, "f") == "from,from_mobile" )
    print(solution(16, testData2, "g") == "group,group_name,group_id")
    print(solution(16, testData2, "m") == "-1")

thanks for your reading