题目
问题描述
在开发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:萌新笔者,欢迎指教讨论。