介绍
豆包青训营是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目,主要面向在校大学生。该项目的目标是培养具有职业竞争力的优秀开发工程师,并提供全程免费的课程,不收取任何费用。
课程内容和方向
豆包青训营的课程涵盖前端、后端和AI方向。在这个飞速发展的AI时代,学员将与豆包MarsCode团队一起深入探索技术领域,学习和运用AI,提高编程效率。此外,课程还包括大数据方向,适合对大数据感兴趣的学员学习,
本文提供训练营试题解析供参考
试题1:观光景点组合得分问题
问题描述:
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
def solution(values: list) -> int:
n = len(values)
if n < 2:
return 0 # 如果数组长度小于2,无法形成组合,返回0或其他适当值
# 初始化
max_i_plus_values = values[0] + 0 # 初始时i=0
max_score = values[0] + values[1] + 0 - 1 # 初始组合 (0,1)
# 从第二个元素开始遍历
for j in range(1, n):
# 计算当前j的values[j] - j
current = values[j] - j
# 更新最大组合得分
max_score = max(max_score, max_i_plus_values + current)
# 更新max_i_plus_values
max_i_plus_values = max(max_i_plus_values, values[j] + j)
return max_score
if __name__ == '__main__':
# 测试样例1
print(solution(values=[8, 3, 5, 5, 6]) == 11) # 输出: True
# 测试样例2
print(solution(values=[10, 4, 8, 7]) == 16) # 输出: True
# 测试样例3
print(solution(values=[1, 2, 3, 4, 5]) == 8) # 输出: True
试题2:数组元素之和最小化
问题描述:
小C希望构造一个包含n个元素的数组,且满足以下条件:
数组中的所有元素两两不同。
数组所有元素的最大公约数为 k。
数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
def solution(n: int, k: int) -> int:
multiples = []
current_multiple = k
while len(multiples) < n:
multiples.append(current_multiple)
current_multiple += k
result = sum(multiples)
return result
if __name__ == '__main__':
print(solution(n = 3, k = 1) == 6)
print(solution(n = 2, k = 2) == 6)
print(solution(n = 4, k = 3) == 30)
试题3:最少前缀操作问题
问题描述:
小U和小R有两个字符串,分别是S和T,现在小U需要通过对S进行若干次操作,使其变成T的一
前缀。操作可以是修改S的某一个字符,
或者删除S末尾的字符。现在你需要帮助小U计算出,最少
需要多少次操作才能让S变成T的前缀。
def solution(S: str, T: str) -> int:
len_S = len(S)
len_T = len(T)
# 计算需要删除的字符数量
deletions = max(0, len_S - len_T)
# 截断 S,使其长度不超过 T
S_new = S[:len_T] if len_S > len_T else S
# 计算需要修改的字符数量
modifications = 0
for i in range(len(S_new)):
if S_new[i] != T[i]:
modifications += 1
# 总操作次数
total_operations = deletions + modifications
return total_operations
if __name__ == '__main__':
print(solution("aba", "abb") == 1) # 输出: True
print(solution("abcd", "efg") == 4) # 输出: True
print(solution("xyz", "xy") == 1) # 输出: True
print(solution("hello", "helloworld") == 0) # 输出: True
print(solution("same", "same") == 0) # 输出: True
试题4:最大矩形面积问题
问题描述:
def solution(n, array):
max_area = 0 # 用于记录最大面积
# 遍历所有可能的 k 值
for k in range(1, n + 1):
# 遍历数组,计算以每个元素为起点的 k 个相邻元素的最小值
for i in range(n - k + 1):
# 计算当前 k 个相邻元素的最小值
min_height = min(array[i:i + k])
# 计算面积
area = k * min_height
# 更新最大面积
if area > max_area:
max_area = area
return max_area
if __name__ == "__main__":
# Add your test cases here
print(solution(5, [1, 2, 3, 4, 5]) == 9)
print(solution(6, [5, 4, 3, 2, 1, 6]) == 9)
print(solution(4, [4, 4, 4, 4]) == 16)
试题5:环形数组中的最大贡献值
问题描述:
def solution(n: int, a: list) -> int:
max_contribution = 0
# 遍历所有可能的下标对 (i, j)
for i in range(n):
for j in range(n):
if i != j:
# 计算最短距离
dist = min(abs(i - j), n - abs(i - j))
# 计算贡献值
contribution = (a[i] + a[j]) * dist
# 更新最大贡献值
if contribution > max_contribution:
max_contribution = contribution
return max_contribution
if __name__ == '__main__':
print(solution(n = 3, a = [1, 2, 3]) == 5)
print(solution(n = 4, a = [4, 1, 2, 3]) == 12)
print(solution(n = 5, a = [1, 5, 3, 7, 2]) == 24)