介绍
豆包青训营是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目,主要面向在校大学生。该项目的目标是培养具有职业竞争力的优秀开发工程师,并提供全程免费的课程,不收取任何费用。
课程内容和方向
豆包青训营的课程涵盖前端、后端和AI方向。在这个飞速发展的AI时代,学员将与豆包MarsCode团队一起深入探索技术领域,学习和运用AI,提高编程效率。此外,课程还包括大数据方向,适合对大数据感兴趣的学员学习,
本文提供训练营试题解析供参考
试题1:小C的帖子吸引力最大化
问题描述:
小C管理了一个帖子社区,他发布了n个帖子,每个帖子都有其点赞数和点踩数。小C希望能够组合任意数量的帖子,以便让这些帖子的组合在整个社区中产生最大的吸引力。
帖子的吸引力定义为其点赞数和点踩数差的绝对值,即 |x - y|,其中x是点赞数,y是点踩数。小C想要找出一组帖子,使得它们的总点赞数和总点踩数的差的绝对值最大化。
你的任务是帮助小C计算出可以达到的最大吸引力。
def solution(n: int, a: list, b: list) -> int:
# 计算所有点赞数和点踩数的总和
total_a = sum(a)
total_b = sum(b)
# 定义状态数组,dp[i][j] 表示在前 i 个帖子中,是否可以使得点赞数和点踩数的差为 j
# 由于差值可能为负数,我们需要将其偏移 total_a + total_b 以确保索引为非负数
dp = [[False] * (2 * (total_a + total_b) + 1) for _ in range(n + 1)]
# 初始化,不选择任何帖子时,差值为0
dp[0][total_a + total_b] = True
# 状态转移
for i in range(1, n + 1):
for j in range(2 * (total_a + total_b) + 1):
if dp[i - 1][j]:
# 选择第 i 个帖子
dp[i][j + a[i - 1] - b[i - 1]] = True
# 不选择第 i 个帖子
dp[i][j] = True
# 找到最大的差值
max_diff = 0
for j in range(2 * (total_a + total_b) + 1):
if dp[n][j]:
max_diff = max(max_diff, abs(j - (total_a + total_b)))
return max_diff
if __name__ == '__main__':
print(solution(4, [4, 2, 1, 1], [2, 1, 4, 4]) == 6)
print(solution(3, [10, 20, 30], [15, 25, 5]) == 25)
print(solution(5, [1, 5, 3, 7, 9], [2, 6, 4, 8, 10]) == 5)
试题2:小E的比赛得分计算
问题描述:
小E正在参加一系列比赛,共有n场比赛。赢得一场比赛可以获得1分,而如果连续赢得两场或更多比赛,第二场及之后的每一场比赛都会额外获得1分。现在,给定n场比赛的结果,请计算小E的总分数。
def solution(n: int, a: list) -> int:
total_score = 0 # 初始化总分数
consecutive_wins = 0 # 初始化连续赢得比赛的次数
for i in range(n):
if a[i] == 1:
# 如果当前比赛赢了
total_score += 1 # 增加基础分数
consecutive_wins += 1 # 增加连续赢得比赛的次数
if consecutive_wins > 1:
# 如果连续赢得比赛的次数大于1,增加额外分数
total_score += 1 # 增加额外分数
else:
# 如果当前比赛输了,重置连续赢得比赛的次数
consecutive_wins = 0
return total_score
if __name__ == '__main__':
print(solution(5, [1, 1, 1, 0, 1]) == 6)
print(solution(3, [1, 0, 1]) == 2)
print(solution(6, [1, 1, 0, 0, 1, 1]) == 6)
print(solution(4, [0, 0, 1, 1]) == 3)
试题3:小M的37进制数字相乘问题
问题描述:
小M最近在学习37进制的表示方法。37进制使用的字符集是:“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$”,其中字符依次代表从0到36的数字。现在,给定两个37进制的数字a和b,请你计算它们的乘积并输出结果,结果也需使用37进制表示。
def solution(a: str, b: str) -> str:
# 1. 将37进制字符串转换为整数
numA = convertToDecimal(a)
numB = convertToDecimal(b)
# 2. 进行整数乘法
product = numA * numB
# 3. 将乘法结果转换回37进制字符串
return convertToBase37(product)
# 将37进制字符串转换为整数
def convertToDecimal(str):
base37_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
decimal_value = 0
power = 0
# 从字符串的最后一位开始处理
for char in reversed(str):
# 获取字符对应的数值
value = base37_chars.index(char)
# 计算当前位的数值
decimal_value += value * (37 ** power)
power += 1
return decimal_value
# 将整数转换为37进制字符串
def convertToBase37(num):
if num == 0:
return "0"
base37_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
base37_str = ""
while num > 0:
remainder = num % 37
base37_str = base37_chars[remainder] + base37_str
num //= 37
return base37_str
if __name__ == '__main__':
print(solution("ZZ", "X") == 'V8')
print(solution("A", "B") == '2$')
试题4:小M的比赛胜场计算
问题描述:
小M参加了一场n个人的比赛,比赛规则是所有选手两两对决。每个人有一个能力值,对应着他们的序号。参赛者同时被分为黄色或蓝色两种颜色。比赛胜负的规则如下:
当比赛双方颜色不同时,能力值大的选手获胜;
当比赛双方颜色相同时,能力值较小的选手获胜。
你需要帮助小M计算每个选手在比赛中能赢得的场数。
import java.util.Arrays;
public class Main {
public static int[] solution(int n, int[] a) {
// write code here
int[] wins = new int[n];
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
// 判断胜负并更新胜场数
if (a[i] != a[j]) {
// 颜色不同,能力值大的选手获胜
if (i > j) {
wins[i]++;
} else {
wins[j]++;
}
} else {
// 颜色相同,能力值小的选手获胜
if (i < j) {
wins[i]++;
} else {
wins[j]++;
}
}
}
}
return wins;
}
public static void main(String[] args) {
System.out.println(Arrays.equals(solution(3, new int[]{0, 0, 1}), new int[]{1, 0, 2}));
System.out.println(Arrays.equals(solution(4, new int[]{1, 0, 1, 0}), new int[]{1, 2, 1, 2}));
System.out.println(Arrays.equals(solution(5, new int[]{0, 1, 0, 1, 0}), new int[]{2, 2, 2, 2, 2}));
}
}