C++SQL代码补全 | 豆包MarsCode AI刷题

84 阅读3分钟

题目

SQL代码补全
问题描述

在一个 SQL 编辑器中,需要提供 SQL 代码自动补全的功能,自动补全的候选内容包含两方面:

  1. SQL 语法关键字,如 select、where、limit 等,数量约 80 个
  2. 数据库名、表名和字段名,如 origin_log_db、event_log_table、user_id,from_mobile,数量 <= 10000 个

例如:用户输入 s,此时给出补全提示 select;输入 fr,给出补全提示 from 和 from_mobile 让用户选择,输入至 from_ 时,给出补全提示 from_mobile

输入格式
  1. 第一行是一个整数数字 N,用来表示接下来有几行是代码补全的候选内容
  2. 第二到 N + 1 行的每一行是一条候选内容,包括 SQL 关键字,或者数据库名、表名、字段名,所有字符均为小写
  3. 最后一行是模拟用户在写 SQL 时输入的字符片段(空格或者回车之后的内容),例如 sel
输出格式

最后一行用户输入字符片段的补全提示列表,列表按字母序排序

无补全提示时输出 -1

输入样例

8

select

from

where

limit

origin_log_db

event_log_table

user_id

from_mobile

f

输出样例

from

from_mobile

数据范围

数据库名、表名和字段名总数 <= 10000

思路解析

遍历data数组,若input为data[i]的前缀子串,则加入data[i]

1.考虑到答案需要查重按字母序排序,可以使用set(有序不重复)(有序即不会改变插入set的顺序)数据结构存放答案,排序可以使用sort方法(algorithm库自带的方法)

2.查找前缀子串,记录input的长度为inputLength,取data[i]的前inputLength长的子串,再比较两者是否相等即可

3.遍历set,输入至字符串res,再去除res末尾多余的",",返回res

C++代码

#include <cstddef>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
using namespace std;


std::string solution(int num, std::vector<std::string> data, std::string input) {
    // Please write your code here
    set<string> ans;  //存放data中符合条件的字符串
    int inputLength = input.length();  //input的长度
    sort(data.begin(),data.end());  //先对data进行排序,后面遍历data添加至ans就是有序的
    for(int i=0;i<num;i++)  //遍历data
    {
        string dstr = data[i].substr(0,inputLength);  //取data[i]和input相同长度的前缀
        size_t foundStr = dstr.find(input);  //判断前缀是否相等,这里可以直接用==判断(一开始我不是这么写的后面忘改了=-=)
        if(foundStr!=std::string::npos)
        {
            ans.insert(data[i]);  //符合条件即插入ans
        }
    }
    if(ans.empty()) return "-1";  //如果ans为空,即找不到符合条件的字符串,返回-1
    else
    {
        string res = "";
        for(string astr:ans)
        {
            res = res + astr + ",";  //字符串之间用","间隔
        }
        res = res.substr(0,res.length()-1);  //去掉res末尾多余的","
        return res; //返回res
    }
    
}

int main() {
    //  You can add more test cases here
    std::vector<std::string> testData1 = {"select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"};
    std::vector<std::string> testData2 = {"select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"};

    std::cout << (solution(8, testData1, "f") == "from,from_mobile") << std::endl;
    std::cout << (solution(16, testData2, "g") == "group,group_name,group_id") << std::endl;
    std::cout << (solution(16, testData2, "m") == "-1") << std::endl;

    return 0;
}

(话说样例2是不是错了qaq,group_name应该在group_id后面才对吧,虽然不影响答案的评判)