引言

随着AI领域的发展,底层算法确实起到了决定性的作用。为了跟上这个快速发展的领域,我们需要不断学习和提升自己的技能。刷题是一种很好的方式,可以帮助我们巩固基础知识,提高解决问题的能力。

介绍

‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目。该项目的目标是培养具有职业竞争力的优秀开发工程师,并提供全程免费的课程,不收取任何费用‌。

课程内容和方向

豆包青训营的课程涵盖前端、后端和AI方向。在这个飞速发展的AI时代,学员将与豆包MarsCode团队一起深入探索技术领域,学习和运用AI,提高编程效率‌。此外,课程还包括大数据方向,适合对大数据感兴趣的学员学习‌,

本文提供训练营试题解析供参考

试题1:密码匹配修改问题

问题描述:
小M 和小R 正在进行一个二进制调整任务,他们需要通过对整数 a 和 b 的二进制位取反,修改其二进制表示,以确保最终结果满足 a OR b = c 的条件。为实现这个目标,他们需要仔细分析每个位的变化,计算出完成这一过程所需的最小翻转次数,以便能够有效地解锁隐藏的信息。

def solution(a: int, b: int, c: int) -> int:
    # 初始化翻转次数
    flips = 0
    
    # 逐位分析
    for i in range(32):  # 假设整数是32位的
        # 获取a、b、c的第i位
        bit_a = (a >> i) & 1
        bit_b = (b >> i) & 1
        bit_c = (c >> i) & 1
        
        # 如果 (a OR b) 的第i位不等于c的第i位,则需要翻转
        if (bit_a | bit_b) != bit_c:
            # 计算需要翻转的次数
            if bit_c == 0:
                # 如果c的第i位是0,则a和b的第i位必须都是0
                if bit_a == 1:
                    flips += 1
                if bit_b == 1:
                    flips += 1
            else:
                # 如果c的第i位是1,则a和b的第i位至少有一个是1
                flips += 1
    
    return flips

试题2:小U的最后字串任务

问题描述:
小U 手中有一个字符串 s,帮他希望找出字符串 s 的最大字典序子串。

def solution(s: str) -> str:
    # 初始化最大子串为空字符串
    max_substring = ""
    
    # 遍历所有可能的起始位置
    for i in range(len(s)):
        # 遍历所有可能的结束位置
        for j in range(i + 1, len(s) + 1):
            # 获取当前子串
            current_substring = s[i:j]
            
            # 比较当前子串与最大子串的字典序
            # 如果当前子串更大,更新最大子串
            if current_substring > max_substring:
                max_substring = current_substring
    
    return max_substring

试题3:工作计划的最小难度

问题描述:
给定一个数组,将其划分成d个非空子数组,使其最大值之和最小。如果无法划分,返回-1,否则返回最大和的最小值。

from typing import List

def solution(jobDifficulty: List[int], d: int) -> int:
    n = len(jobDifficulty)
    if n < d:
        return -1
    
    # 初始化 dp 数组,大小为 (n+1) x (d+1)
    dp = [[float('inf')] * (d + 1) for _ in range(n + 1)]
    
    # 初始化 dp[0][0]
    dp[0][0] = 0
    
    # 填充 dp 数组
    for i in range(1, n + 1):
        for j in range(1, d + 1):
            max_difficulty = 0
            for k in range(i - 1, j - 2, -1):
                # 计算从 k 到 i-1 的最大难度
                max_difficulty = max(max_difficulty, jobDifficulty[k])
                # 状态转移方程
                dp[i][j] = min(dp[i][j], dp[k][j - 1] + max_difficulty)
    
    return dp[n][d]

if __name__ == '__main__':
    print(solution(jobDifficulty=[6, 5, 4, 3, 2, 1], d=2) == 7)
    print(solution(jobDifficulty=[6, 9, 9], d=4) == -1)
    print(solution(jobDifficulty=[1, 4, 1], d=3) == 6)

试题4:拼凑单词 chi

问题描述:
小C在处理一个字符串问题。给定一个字符串 text,你需要使用 text 中的字母尽可能多地拼凑出单词 “chi”。字符串中的每个字母最多只能被使用一次。你需要返回最多可以拼凑出多少个单词 “chi”。

def solution(text: str) -> int:
    # 统计字符频率
    char_count = {}
    for char in text:
        if char in char_count:
            char_count[char] += 1
        else:
            char_count[char] = 1
    
    # 计算可以拼凑出多少个 "chi"
    # 关键步骤:计算 'c'、'h' 和 'i' 的最小出现次数
    count_c = char_count.get('c', 0)
    count_h = char_count.get('h', 0)
    count_i = char_count.get('i', 0)
    
    # 返回结果
    return min(count_c, count_h, count_i)

if __name__ == '__main__':
    print(solution(text='chiichcc') == 2)
    print(solution(text='chicchcic') == 2)
    print(solution(text='cccchhii') == 2)

试题5:按位与操作的异或和计算

问题描述:
小C 有两个非负整数数组 arr1 和 arr2。他想构建一个新的列表,这个列表的每个元素是通过将 arr1[i] 和 arr2[j] 进行按位与运算(AND)得到的,其中 0 <= i < arr1.length 且 0 <= j < arr2.length。

接着,小C 需要计算这个列表中所有元素的异或和,也就是将列表中的每个元素通过按位异或运算(XOR)进行合并,最终得到一个结果。如果列表中只有一个元素,那么异或和就是该元素本身。

你需要帮助小C 计算出这个列表的异或和。

from typing import List

def solution(arr1: List[int], arr2: List[int]) -> int:
    # 初始化一个列表来存储按位与运算的结果
    and_results = []
    
    # 遍历 arr1 中的每个元素
    for num1 in arr1:
        # 遍历 arr2 中的每个元素
        for num2 in arr2:
            # 计算 num1 和 num2 的按位与运算结果,并添加到列表中
            and_results.append(num1 & num2)
    
    # 初始化异或和为 0
    xor_sum = 0
    
    # 对列表中的所有元素进行异或运算
    for result in and_results:
        xor_sum ^= result
    
    # 返回最终的异或和
    return xor_sum

if __name__ == '__main__':
    print(solution(arr1=[2, 3, 5], arr2=[6, 7]) == 0)
    print(solution(arr1=[1, 6], arr2=[4, 9, 10]) == 7)
    print(solution(arr1=[0, 1, 4], arr2=[1, 3]) == 0)
    print(solution(arr1=[7, 2], arr2=[8, 6]) == 4)
    print(solution(arr1=[5, 3, 2], arr2=[0, 1]) == 0)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐