青训营-豆包MarsCode技术训练营试题解析四十五

引言

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

介绍

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

课程内容和方向

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

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

试题1:按规则生成数组与求最大值问题

问题描述:
小H 参与了一项任务,他获得了一个整数 n,需要根据以下规则生成一个长度为 n + 1 的数据列表 a:

初始时,a[0] = 0,a[1] = 1。
当 2 <= 2 * i <= n 时,a[2 * i] = a[i]。
当 2 <= 2 * i + 1 <= n 时,a[2 * i + 1] = a[i] + a[i + 1]。
小H 想知道生成的数据列表 a 中的最大值是多少。

from typing import List

def solution(n: int) -> int:
    # 初始化列表 a
    a = [0] * (n + 1)
    a[0] = 0
    a[1] = 1
    
    # 填充列表 a
    for i in range(1, (n + 1) // 2 + 1):
        if 2 * i <= n:
            a[2 * i] = a[i]
        if 2 * i + 1 <= n:
            a[2 * i + 1] = a[i] + a[i + 1]
    
    # 查找列表 a 中的最大值
    max_value = max(a)
    
    return max_value

if __name__ == '__main__':
    print(solution(n=6) == 3)
    print(solution(n=10) == 4)
    print(solution(n=4) == 2)
    print(solution(n=7) == 3)

试题2:按键时间与最长持续键识别

问题描述:
在一次古老的乐器演奏测试中,小G 记录了每次敲击乐器的时间和音符的顺序。每次敲击乐器时,小G 记录下音符,并在音符被敲响后的确切时间记录下来。你现在有两个信息来源:一个是字符串 notesPlayed,它代表敲击乐器的音符顺序;另一个是数组 hitTimes,它记录了每次音符响起时的时间。

每个音符的持续时间通过以下方式计算:

对于第 i 次敲击,其持续时间为 hitTimes[i] - hitTimes[i - 1],其中第 0 次敲击的持续时间为 hitTimes[0]。
如果有多个音符的持续时间相同,要求返回字母顺序更大的那个音符。
你的任务是帮助小G 找到持续时间最长的音符。

from typing import List

def solution(hitTimes: List[int], notesPlayed: str) -> str:
    # 初始化最长持续时间的音符和最长持续时间
    longest_note = ""
    longest_duration = 0
    
    # 遍历音符和时间
    for i in range(len(notesPlayed)):
        if i == 0:
            # 第0次敲击的持续时间为 hitTimes[0]
            duration = hitTimes[0]
        else:
            # 其他敲击的持续时间为 hitTimes[i] - hitTimes[i - 1]
            duration = hitTimes[i] - hitTimes[i - 1]
        
        # 如果当前音符的持续时间大于已记录的最长持续时间
        if duration > longest_duration:
            # 更新最长持续时间的音符和最长持续时间
            longest_note = notesPlayed[i]
            longest_duration = duration
        elif duration == longest_duration:
            # 如果当前音符的持续时间等于已记录的最长持续时间,但音符的字母顺序更大
            if notesPlayed[i] > longest_note:
                # 更新最长持续时间的音符
                longest_note = notesPlayed[i]
    
    # 返回最长持续时间的音符
    return longest_note

if __name__ == '__main__':
    print(solution(hitTimes=[8, 25, 47, 58], notesPlayed='axbc') == 'b')
    print(solution(hitTimes=[13, 28, 40, 52, 69], notesPlayed='byzec') == 'c')
    print(solution(hitTimes=[17, 32, 57, 67], notesPlayed='pfrb') == 'r')

试题3:按顺序组合的元音字符统计

问题描述:
小H 对不同类型的任务分配方案很感兴趣。给定一个整数 n,他想知道在一个长度为 n 的任务分配表中,任务如何在五种类型之间进行组合。任务类型可以从以下五种选取:A、B、C、D 和 E,并且需要满足下列规则:

分配表中的每个任务类型必须按序分配(即 task[i] 的任务类型编号不能比 task[i+1] 的编号小)。
你的任务是帮助小H计算并返回满足该规则的分配方案数量

def solution(n: int) -> int:
    # 定义 dp 数组
    dp = [[0] * 5 for _ in range(n + 1)]
    
    # 初始化
    for j in range(5):
        dp[1][j] = 1
    
    # 状态转移
    for i in range(2, n + 1):
        for j in range(5):
            for k in range(j + 1):
                dp[i][j] += dp[i - 1][k]
    
    # 最终结果
    result = sum(dp[n][j] for j in range(5))
    return result

if __name__ == '__main__':
    print(solution(n=2) == 15)
    print(solution(n=6) == 210)
    print(solution(n=10) == 1001)
    print(solution(n=1) == 5)

试题4:数位长度筛选问题

问题描述:
在一个神秘的探险中,年轻的探险家小乐发现了一箱宝藏,箱子里装满了各式各样的神秘符文,每个符文都代表一个整数。他对这些符文的特性产生了极大的好奇,尤其是关于它们的长度。

小乐决定只关注那些符文位数为偶数的,想要统计出这样的符文有多少个。你的任务是帮助小乐计算出长度为偶数的符文数量,并给出最终的统计结果。

from typing import List

def solution(nums: List[int]) -> int:
    # 初始化计数器
    count = 0
    
    # 遍历列表中的每一个整数
    for num in nums:
        # 计算整数的位数
        digit_count = len(str(num))
        
        # 判断位数是否为偶数
        if digit_count % 2 == 0:
            # 如果是偶数,增加计数器的值
            count += 1
    
    # 返回最终的计数结果
    return count

if __name__ == '__main__':
    print(solution(nums=[12, 345, 2, 6, 7896]) == 2)
    print(solution(nums=[555, 901, 482, 1771]) == 1)
    print(solution(nums=[1, 22, 333, 4444]) == 2)

试题5:数值生成与运算问题

问题描述:
已知 n 和 start,计算 start xor (start + 2) xor (start + 4) … xor (start + n + n - 2)。

def solution(n: int, start: int) -> int:
    # 初始化结果为0
    result = 0
    
    # 遍历序列,计算异或结果
    for i in range(n):
        # 计算当前元素
        current = start + 2 * i
        # 更新结果
        result ^= current
    
    return result

if __name__ == '__main__':
    print(solution(n=12, start=3) == 24)
    print(solution(n=20, start=16) == 0)
    print(solution(n=18, start=9) == 2)
    print(solution(n=7, start=1) == 15)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HappyAcmen

非常感谢大佬的鼓励!感谢感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值