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'
-
理解问题:
- 我们需要实现一个自动补全功能,根据用户输入的字符片段,从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。
- 如果只有一个匹配项,直接返回该项;如果没有匹配项,返回
"-1"
。
-
算法步骤:
- 初始化一个空集合
res
来存储匹配的结果。 - 遍历
data
列表中的每个字符串,检查它是否以input
开头。 - 如果匹配,将该字符串添加到
res
集合中。 - 将
res
集合转换为列表,并按字典序排序。 - 如果排序后的列表为空,返回
"-1"
。 - 否则,返回以逗号分隔的排序后的列表。
- 初始化一个空集合
-
代码实现:
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
表示空位。
算法步骤
- 遍历棋盘:我们需要遍历棋盘上的每一个空位(即值为
0
的位置)。 - 检查每个空位:对于每一个空位,检查在该位置放置棋子后是否能形成五子连线。
- 方向检查:为了检查是否能形成五子连线,我们需要检查四个方向:
- 右 (1, 0)
- 下 (0, 1)
- 右下 (1, 1)
- 左下 (1, -1)
- 正反向检查:对于每个方向,分别检查正向和反向是否能形成连续的五个棋子。
- 记录结果:如果某个空位放置棋子后能形成五子连线,则记录该位置。
代码实现:
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]])