小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)