11月4日-11月7日刷题总结 | 豆包MarsCode AI刷题

78 阅读7分钟

11月4日 SQL代码补全功能


问题描述 

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

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

思考

  • 本题需要遍历已知关键字列表 data,去检查哪些关键字以输入片段 input 开头。 在这里,我们使用字符串的内置方法 startswith 判断前缀。
  • 本题还可以使用 set 数据结构避免重复关键字的干扰。
  • 将筛选结果转化为列表,使用 sorted 按字典序排序。 使用 ','.join 将排序后的结果转化为字符串。如果筛选后的结果为空,直接返回 -1。

代码

def solution(num, data, input):    # 筛选出以 input 开头的候选词,并去重    candidates = set(word for word in data if word.startswith(input))        # 如果有候选词,按字典序排序并连接为字符串返回    if candidates:        return ','.join(sorted(candidates))        # 如果没有候选词,返回 -1    return '-1'

分析:

  • 字符串方法 startswith: 用于判断字符串是否以指定前缀开头,常用于前缀匹配。 
  • 集合去重: 使用 set 数据结构去掉重复候选词,保证结果唯一性。 
  • 字典序排序: 使用内置函数 sorted 对候选词进行字典序排序,符合题目要求。 

11月5日 二进制之和 

问题描述

小U和小R喜欢探索二进制数字的奧秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过0(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

思考

  • 从二进制字符串的低位(右端)开始逐位处理,将两字符串的每一位与进位(carry)相加。 每次计算需要更新当前位的结果和进位。
  • 如果两位相加的和大于等于2,则取模作为当前位,商作为进位。
  • 将每次计算的结果存储在一个数组中,数组从高位到低位存储最终的二进制结果。 最后,将二进制数组转化为十进制表示。

代码

def solution(binary1, binary2):    # 先将两个二进制字符串的长度进行比较    max_len = max(len(binary1), len(binary2))        # 结果数组,预留足够的空间以存储每位的和    result = [0] * (max_len + 1)        # 进位    carry = 0        # 从最低位开始逐位相加    for i in range(max_len):        # 取当前位,若超出边界则为 0        bit1 = int(binary1[-(i + 1)]) if i < len(binary1) else 0        bit2 = int(binary2[-(i + 1)]) if i < len(binary2) else 0                # 当前位的和加上进位        total = bit1 + bit2 + carry        result[-(i + 1)] = total % 2  # 当前位        carry = total // 2  # 更新进位    # 如果最后还有进位,将其放在结果最前面    if carry > 0:        result[0] = carry        # 将结果转为十进制    decimal_value = 0    for i in range(len(result)):        decimal_value += result[i] * (2 ** (len(result) - 1 - i))        return str(decimal_value)

分析:

  • 代码中使用 int(binary[-(i+1)]) 从右向左逐位取值,方便对齐处理。 
  • 每次计算当前位和进位时,total % 2 得到当前位结果,total // 2 得到进位。

11月6日 理想火车站定位

问题描述 

小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1,y1]到另一个位置[x2,y2]的距离计算方法为|x1 - x2|+|y1 - y2|,即曼哈顿距离。 在初步考察后,市政府列出了M个可能的火车站建设点。

为了使得市民到火车站的总旅行时间最短,小F希望选出一个最优位置作为火车站的地址。 请你帮助小F计算出哪一个位置最适合建设新火车站。

  • N: 市民的总人数。 
  • M: 可建设火车站的备选位置数。 
  • citizens: 一个列表,每个元素是一个元组[xi,yi],表示第i位市民的居住位置。 
  • locations: 一个列表,每个元素是一个元组[pi,qi],表示第i个备选的火车站位置,. 如果有多个火车站最优,那么选择第一次出现的那个。

思考

  • 这道题用的是暴力搜索的方法,遍历所有候选火车站位置,计算其到所有市民的曼哈顿距离总和。 记录当前最小的距离总和及对应的火车站位置。
  • 如果有多个备选火车站的位置距离总和相同,则选择列表中首次出现的那个位置。

代码

def solution(n, m, citizens, locations):    min_distance_sum = float('inf')    optimal_location = None    # 遍历每个火车站备选位置    for loc in locations:        total_distance = 0        # 计算当前火车站到所有市民的曼哈顿距离总和        for citizen in citizens:            total_distance += abs(loc[0] - citizen[0]) + abs(loc[1] - citizen[1])                # 更新最优位置        if total_distance < min_distance_sum:            min_distance_sum = total_distance            optimal_location = loc    return optimal_location

11月7日 阿D的最佳飞行路线探索

问题描述 

小C和他的领导小F计划一次飞行,但由于严格的航空管制,他们的飞机仅能按特定的路线飞行:飞机只能飞往当前机场的相邻机场或相同航空公司管理的机场。为了减少起飞次数,小C需要制定最优的飞行路线。

机场由一个数组airports标识,其中: 数组每个元素代表一个独特的机场,元素的值代表不同的航空公司,airports[0]为起点,airports[airports.length -1]为终点假设小C当前在机场i,那么i-1和i+1(如果存在)代表邻近机场,飞机可以直接前往。如果在机场i,且存在airports[i]== airports[j],则机场i和机场j同属一家航空公司,可直接飞往。求最小起飞次数。

思考

  • 这是一个图搜索问题,其中每个机场是一个节点,飞机飞行的合法路线是节点之间的边。目标是从起点出发到终点的最短路径。 
  • 节点连接规则: 相邻机场: 可以直接飞行(i-1 和 i+1)。 同航空公司机场: 如果当前机场和其他机场由同一航空公司管理,可以直接飞行。 
  • 我们使用BFS(广度优先搜索)解决这道题,找到从起点到终点的最短路径。 之所以选择BFS的原因是因为该方法能确保首次到达终点时所用的路径是最短路径。 

代码

from collections import deque, defaultdictdef solution(airports):    n = len(airports)    if n <= 1:        return 0    # 建立航空公司到机场的映射    company_to_airports = defaultdict(list)    for i, company in enumerate(airports):        company_to_airports[company].append(i)    # 初始化队列    queue = deque([(0, 0)])  # (当前位置,起飞次数)    visited = [False] * n    visited[0] = True    while queue:        position, flights = queue.popleft()        # 如果到达终点        if position == n - 1:            return flights        # 飞往相邻的机场        for next_position in [position - 1, position + 1]:            if 0 <= next_position < n and not visited[next_position]:                visited[next_position] = True                queue.append((next_position, flights + 1))        # 飞往同公司管理的其他机场        company = airports[position]        for same_company_position in company_to_airports[company]:            if not visited[same_company_position]:                visited[same_company_position] = True                queue.append((same_company_position, flights + 1))                # 清空当前公司映射,避免重复搜索        company_to_airports[company] = []    return -1 

知识点

  • 使用 BFS 寻找最短路径时,每个节点首次被访问时的路径长度就是最短路径。
  • 在代码中利用 defaultdict 存储航空公司到机场索引的映射,便于快速查找同公司机场。
  • 清空当前航空公司的映射,避免重复搜索同一航空公司机场,减少不必要的计算。