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 存储航空公司到机场索引的映射,便于快速查找同公司机场。
- 清空当前航空公司的映射,避免重复搜索同一航空公司机场,减少不必要的计算。