刷题实践| 豆包MarsCode AI刷题

69 阅读4分钟

问题一(动规)

数字翻译成字符串的可能性

问题描述

小M获得了一个任务,需要将数字翻译成字符串。翻译规则是:0对应"a",1对应"b",依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的翻译方法。

例如:数字12258可以翻译成 "bccfi", "bwfi", "bczi", "mcfi" 和 "mzi",共5种方式。


测试样例

样例1:

输入:num = 12258
输出:5

样例2:

输入:num = 1400112
输出:6

样例3:

输入:num = 2110101
输出:10

样例4:

输入:num = 25
输出:2

样例5:

输入:num = 1023
输出:4

分析及解答

  1. 定义DP数组:用dp[i]表示数字从第1位到第i位的翻译方法数。

  2. 初始化dp[0] = 1,表示没有数字时,翻译方法为1(空翻译)。

  3. 状态转移方程: 遍历数字的每一位,从第二位开始(即索引1)。 对于每一个数字位置i,检查它与前一位数字的组合。 如果当前数字可以单独作为一个字符(即num[i] != 0),那么dp[i] += dp[i-1]。 如果当前位置和前一个位置的数字可以组合成10到25之间的一个字符,则dp[i] += p[i-2]

  4. 结果:最终dp[-1]即为从开头到结尾的所有翻译方法数。

def solution(num):
    # Please write your code here
    # 将数字转换为字符串,便于逐位操作
    s = str(num)
    n = len(s)
    
    if n == 0:
        return 0  # 空字符串无翻译方式
    if n == 1:
        return 1  # 单字符的情况只有一种翻译方式
    
    # 动态规划数组
    dp = [0] * (n + 1)
    dp[0] = 1  # 空字符串一种翻译方式
    dp[1] = 1  # 一个字符也有一种翻译方式
    
    for i in range(2, n + 1):
        # 单独翻译当前字符
        dp[i] = dp[i - 1]
        
        # 前两位字符组合翻译
        two_digit = int(s[i - 2:i])  # 当前字符和前一个字符组合形成的数
        if 10 <= two_digit <= 25:  # 如果组合在10到25之间,可以形成一个新的翻译方式
            dp[i] += dp[i - 2]
    print(dp)
    return dp[n]  # 返回总的翻译方式

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution(12258) == 5)
    print(solution(1400112) == 6)
    print(solution(2110101) == 10)

问题二

贪心猫的鱼干大分配

问题描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。

小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。


测试样例

样例1:

输入:n = 3, cats_levels = [1, 2, 2]
输出:4

样例2:

输入:n = 6, cats_levels = [6, 5, 4, 3, 2, 16]
输出:17

样例3:

输入:n = 20, cats_levels = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
输出:35

分析与解答

以通过两次遍历猫的等级数组来确定每只猫应该得到的最少鱼干。

  1. 初始化:每只猫至少分到1斤鱼干,因此先给所有猫各分配1斤鱼干。

  2. 从左向右遍历

    • 如果当前猫的等级比左边的猫高,那么当前猫的鱼干数量应该比左边的猫多1。
  3. 从右向左遍历

    • 如果当前猫的等级比右边的猫高,并且当前猫的鱼干数量不多于右边的猫,那么当前猫的鱼干数量应该比右边的猫多1。
  4. 计算总鱼干量:最终所有猫的鱼干数量累加就是最小的需求量。

def solution(n, cats_levels):
    # Please write your code here
    fish = [1] * n
    for i in range(1,n):
        if cats_levels[i] > cats_levels[i-1]:
            fish[i] = fish[i-1]+1
    for i in range(n-2, -1, -1):
         if cats_levels[i] > cats_levels[i+1]:
            fish[i] = max(fish[i+1]+1, fish[i])
    return sum(fish)

if __name__ == "__main__":
    #  You can add more test cases here
    cats_levels1 = [1, 2, 2]
    cats_levels2 = [6, 5, 4, 3, 2, 16]
    cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
    print(solution(3, cats_levels1) == 4)
    print(solution(6, cats_levels2) == 17)
    print(solution(20, cats_levels3) == 35)