刷题小记6 | 豆包MarsCode AI刷题

65 阅读3分钟

小u的问号替换问题

问题描述

小C拿到了一个由数字字符和 ? 组成的字符串,她的目标是将所有的 ? 替换成数字字符,使得替换后的字符串表示的十进制整数成为正整数 pp 的倍数。由于方案数可能非常大,需要对最终的结果取模 109+7109+7。


测试样例

样例1:

输入:s = "??",p = 1
输出:100

样例2:

输入:s = "????1",p = 12
输出:0

样例3:

输入:s = "1??2",p = 3
输出:34

思路

最为直接的方法就是可以得到最小数和最大数,然后从最小数迭代到最大的数字就可以得到所有的结果。但是这样实在是太慢。

动态规划的实现

  • 初始化:定义一个动态规划数组 dp,其中 dp[i][r] 表示前 i 个字符组成的字符串,其对 p 取模的余数为 r 的方案数。

  • 状态转移

    • 如果当前字符是数字,直接更新 dp 数组。
    • 如果当前字符是 ?,则需要考虑所有可能的数字(0-9),并更新 dp 数组。
  • 取模操作:在每次更新 dp 数组时,都需要对 10^9 + 7 取模,以防止数值溢出。

  • 最终结果:最终结果是 dp[len(s)][0],即整个字符串对 p 取模为 0 的方案数。

def solution(s: str, p: int) -> int:
    # write code here
    MOD = 10**9 + 7
    n = len(s)
    
    # 初始化 dp 数组
    dp = [[0] * p for _ in range(n + 1)]
    dp[0][0] = 1  # 空字符串对任何数取模都是 0
    
    # 遍历字符串 s
    for i in range(1, n + 1):
        for r in range(p):
            if s[i - 1] == '?':
                # 如果是 '?',考虑所有可能的数字
                for digit in range(10):
                    new_r = (r * 10 + digit) % p
                    dp[i][new_r] = (dp[i][new_r] + dp[i - 1][r]) % MOD
            else:
                # 如果是数字,直接更新
                digit = int(s[i - 1])
                new_r = (r * 10 + digit) % p
                dp[i][new_r] = (dp[i][new_r] + dp[i - 1][r]) % MOD
    
    # 最终结果是 dp[n][0]
    return dp[n][0]

二进制之和

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。


测试样例

样例1:

输入:binary1 = "101" ,binary2 = "110"
输出:'11'

样例2:

输入:binary1 = "111111" ,binary2 = "10100"
输出:'83'

样例3:

输入:binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'

样例4:

输入:binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'

样例5:

输入:binary1 = "11" ,binary2 = "1"
输出:'4'

思路

def solution(binary1, binary2):
    # Please write your code here
    cnt = 0
    jw = 0
    len1 = len(binary1)
    len2 = len(binary2)
    minLen = min(len1,len2)
    n = 0
    for i in range(1,minLen+1):
        sum1 = int(binary1[-i]) + int(binary2[-i]) + jw
        if sum1 >= 2:
            jw = 1
        else:
            jw = 0
        if sum1 == 3 or sum1 == 1:
            cnt += 2 ** n
        n += 1

    for i in range(minLen+1, max(len1,len2) + 1):
        if len1 > len2:
            sum1 = int(binary1[-i]) + jw
        else:
            sum1 = int(binary2[-i]) + jw
        if sum1 >= 2:
            jw = 1
        else:
            jw = 0
        if sum1 == 3 or sum1 == 1:
            cnt += 2 ** n
        n += 1
    if jw == 1:
        cnt += 2 ** n
    print(cnt)
    return str(cnt)