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

94 阅读4分钟

问题描述

在开发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'


问题背景

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

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

思路分析

  1. 函数定义solution(num, data, input)

    • num:数据的数量。
    • data:包含所有可能候选项的列表。
    • input:用户输入的字符片段。
  2. 过滤候选项

    • 使用集合(set)来过滤出以输入字符串开头的候选项,避免重复。
  3. 排序

    • 将集合转换为列表并按字典序排序。
  4. 返回结果

    • 根据候选项的数量决定返回值。
    • 如果没有候选项,返回 '-1'
    • 如果只有一个候选项,返回该候选项。
    • 如果有多个候选项,返回以逗号分隔的字符串。

代码分析

def solution(num, data, input):

num:表示关键词的数量。虽然这个参数在函数内部没有被使用,但在某些情况下可能会有用,例如用于调试或日志记录。 data:一个包含SQL关键字和数据库相关名称的列表。 input:用户输入的字符片段。

筛选候选项

candidates = [word for word in data if word.startswith(input)]

这是一个列表推导式,用于从 data 列表中筛选出所有以 input 字符串开头的单词。

word.startswith(input) 是一个字符串方法,用于检查 word 是否以 input 开头。

结果是一个包含所有匹配单词的新列表 candidates。

排序候选项

candidates.sort()

使用 sort() 方法对 candidates 列表进行原地排序,按照字典序排列。

处理输出

    if not candidates:
        return '-1'
    elif len(candidates) == 1:
        return candidates[0]
    else:
        return ','.join(candidates)

if not candidates: 检查 candidates 列表是否为空。如果是空的,返回 -1。

elif len(candidates) == 1: 检查 candidates 列表是否只有一个元素。如果是,直接返回该元素。

else: 如果 candidates 列表有多个元素,使用 ','.join(candidates) 方法将所有元素连接成一个字符串,并以逗号分隔。

心得分析

  1. 集合的使用

    • 使用集合来过滤候选项可以自动去重,避免了手动去重的复杂性。
    • 集合的插入和查找操作的时间复杂度为 O(1),因此在处理大量数据时效率较高。
  2. 排序的重要性

    • 在自动补全功能中,按字典序排序候选项可以提高用户体验,使用户更容易找到所需选项。
  3. 边界条件的处理

    • 在返回结果时,需要考虑候选项的数量。如果没有候选项,返回 '-1';如果只有一个候选项,直接返回该候选项;如果有多个候选项,返回以逗号分隔的字符串。
  4. 测试用例的设计

    • 设计测试用例时,应考虑不同的情况,包括正常情况、边界情况和异常情况,以确保代码的健壮性。

通过这个问题的解决,我们不仅学会了如何实现一个简单的自动补全功能,还掌握了集合和排序在实际编程中的应用。这些技巧在处理类似问题时非常有用,能够帮助我们编写更高效、更健壮的代码。