字节青训-SQL代码补全功能、五子棋获胜策略

 SQL代码补全功能

问题描述

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

  

  1. 理解问题

    • 我们需要实现一个自动补全功能,根据用户输入的字符片段,从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。
    • 如果只有一个匹配项,直接返回该项;如果没有匹配项,返回 "-1"
  2. 算法步骤:

    • 初始化一个空集合 res 来存储匹配的结果。
    • 遍历 data 列表中的每个字符串,检查它是否以 input 开头。
    • 如果匹配,将该字符串添加到 res 集合中。
    • 将 res 集合转换为列表,并按字典序排序。
    • 如果排序后的列表为空,返回 "-1"
    • 否则,返回以逗号分隔的排序后的列表。
  3. 代码实现

    def solution(num, data, input):
        res = set()  # 使用集合来去重
        for s in data:
            if s.startswith(input):
                res.add(s)
        
        # 对结果按字典序排序
        res = sorted(res)
        
        if not res:
            return "-1"
        else:
            return ",".join(res)
    
    # 你可以在这里添加更多的测试用例
    test_data1 = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"]
    test_data2 = ["select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"]
    
    print(solution(8, test_data1, "f") == "from,from_mobile")
    print(solution(16, test_data2, "g") == "group,group_id,group_name")
    print(solution(16, test_data2, "m") == "-1")

五子棋获胜策略 

问题描述

假设存在一个五子棋棋盘,大小未知。棋盘上已经摆放了一些白色棋子,现在你的手中还有一个白色棋子。你的任务是找出在棋盘的哪些位置摆放这个棋子,能够使棋盘上出现五颗棋子连成一线(不限于横向、纵向或斜向)。

备注:棋盘上当前不存在连成一条线的五个棋子,但至少存在一个点可以通过摆放使得形成五子连线。

测试样例

样例1:

输入:n = 6, array = [[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0]]
输出:[[1, 1], [6, 6]]

样例2:

输入:n = 5, array = [[1, 0, 1, 0, 0], [0, 1, 0, 0, 0], [1, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 0]]
输出:[[5, 5]]

样例3:

输入:n = 5, array = [[1, 0, 1, 0, 0], [1, 1, 0, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 0]]
输出:[]

 

问题理解

题目要求我们在一个五子棋棋盘上找到所有可能的位置,使得在这些位置放置一个白色棋子后,能够形成五子连线(横向、纵向或斜向)。

数据结构选择

  • 棋盘:使用二维数组 board 表示棋盘,其中 1 表示白色棋子,0 表示空位。

算法步骤

  1. 遍历棋盘:我们需要遍历棋盘上的每一个空位(即值为 0 的位置)。
  2. 检查每个空位:对于每一个空位,检查在该位置放置棋子后是否能形成五子连线。
  3. 方向检查:为了检查是否能形成五子连线,我们需要检查四个方向:
    • 右 (1, 0)
    • 下 (0, 1)
    • 右下 (1, 1)
    • 左下 (1, -1)
  4. 正反向检查:对于每个方向,分别检查正向和反向是否能形成连续的五个棋子。
  5. 记录结果:如果某个空位放置棋子后能形成五子连线,则记录该位置。

 代码实现:

def can_form_line(x, y, board, n):
    # 定义四个方向:右,下,右下,左下
    directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
    
    for dx, dy in directions:
        count = 1  # 当前位置记为1

        # 检查正向
        for step in range(1, 5):
            nx = x + dx * step
            ny = y + dy * step
            if 0 <= nx < n and 0 <= ny < n and board[nx][ny] == 1:
                count += 1
            else:
                break

        # 检查反向
        for step in range(1, 5):
            nx = x - dx * step
            ny = y - dy * step
            if 0 <= nx < n and 0 <= ny < n and board[nx][ny] == 1:
                count += 1
            else:
                break

        # 如果形成五子连线,则返回 True
        if count >= 5:
            return True

    return False  # 没有符合条件的连线

def solution(n, board):
    results = []
    # 检查每个位置是否能放置新棋子形成五子连线
    for i in range(n):
        for j in range(n):
            if board[i][j] == 0:  # 只检查空位
                if can_form_line(i, j, board, n):
                    results.append([i + 1, j + 1])  # 记录行列,+1因要求从1开始

    return results  # 直接返回列表

if __name__ == "__main__":
    array = [
        [0, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0]
    ]

    print(solution(6, array) == [[1, 1], [6, 6]])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像污秽一样

谢谢谢谢谢谢谢谢谢谢谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值