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

1 阅读2分钟

题目

问题描述

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

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


测试样例

样例1:

输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "f"
输出:'from,from_mobile'

样例2:

输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "wh"
输出:'where'

样例3:

输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "z"
输出:'-1'

样例4:

输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "origin"
输出:'origin_log_db'

分析

乍一看,这道题是一个非常简单的字符串匹配为题,直接使用str.startswith()函数就能实现。但是实际上需要认真细致地分析题目条件以及输入输出。

首先简单写代码

for mstr in data:
    if mstr.startswith(input):
        out_str = out_str + ',' + mstr

看起来没什么问题,但实际上存在很多问题:

  • 没有排序:题目要求按照字典序输出,但显然上述代码并没有进行相应的处理。
  • 没有考虑输出为空的情况:应单独枚举输出为'-1'
  • 没有考虑重复:根据常识编译器的自动补全功能不应该能够输出重复的方法。
  • 没有考虑首个字符串前面并没有','

虽然以上问题的确可以通过多次提交测试,从而分析出所有情况,但如果是黑盒测试则会产生很多错误,所以应认真分析全面考虑各种可能的情况。

处理上述问题的方法也很简单:

  • 按字典序排列直接使用sort函数即可
  • 去除重复可以使用set数据格式进行存储再转换成list格式进行输出
  • 首个字符串的输出,在前面判断一下输出是否为空即可

接下来考虑,我们是否可以让我们的代码在正确的前提条件下更简洁呢? 当然可以,我们可以将简单的循环和判断进行合并

out_str = list(set(mstr for mstr in data if mstr.startswith(input)))
out_str.sort()
return '-1' if out_str == [] else ','.join(out_str)

三行代码即可完成任务。

ps:萌新笔者,欢迎指教讨论。