classSolution:### 0210 模拟(124 ms,15 MB)defmultiply(self, num1:str, num2:str)->str:if num1 =='0'or num2 =='0':return'0'
m, n =len(num1),len(num2)# 长度为m和n的两个数的乘积最多为(m+n)位数,至少为(m+n-1)位数
arr =[0]*(m + n)for i inrange(m-1,-1,-1):for j inrange(n-1,-1,-1):# 注意:这里使用+=来累加每一个对应数位的数字!
arr[i+j+1]+=int(num1[i])*int(num2[j])# 注意:这里的结束下标为0,因为需要使用i-1!for i inrange(m+n-1,0,-1):# 这里先累加先获取低位的可能进位
arr[i-1]+= arr[i]//10# 低位再对10求余得到此位上正确的值
arr[i]%=10# 注意:返回之前需要先判断两数之积的位数(即首位不能为0)!
idx =1if arr[0]==0else0return''.join(str(num)for num in arr[idx:])
字符串相加
classSolution:### 0210 双指针模拟(56 ms,14.9 MB)defaddStrings(self, num1:str, num2:str)->str:
m, n =len(num1),len(num2)
num1, num2 = num1[::-1], num2[::-1]
res, carry =[],0for i inrange(max(m, n)):
a =int(num1[i])if i < m else0
b =int(num2[i])if i < n else0
cur = a + b + carry
if cur <10:
res.append(str(cur))
carry =0else:
res.append(str(cur%10))
carry = cur //10if carry !=0: res.append(str(carry))return''.join(res[::-1])
defaddStrings36(str1, str2):
str1, str2 = str1[::-1], str2[::-1]# 先将两个字符串数字逆序,即从各位开始计算
m, n =len(str1),len(str2)
carry, res ='0',[]
str_ls =['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']# 取两个字符串数位数更多的进行循环for i inrange(max(m, n)):
a = str1[i]if i < m else'0'
b = str2[i]if i < n else'0'# 计算当前位上的累加值
cur = str_ls.index(a)+ str_ls.index(b)+ str_ls.index(carry)# 判断是否小于36(即是否需要进位)if cur <36:
res.append(str_ls[cur])
carry ='0'# 若小于36,则carry直接置零else:
res.append(str_ls[cur %36])
carry =str(cur //36)# 注意:这里需要根据carry来更新进位数!# 注意:需要判断进位是否还有剩余!if carry !='0': res.append(carry)return''.join(res[::-1])# 注意:返回时需要再次逆序返回!
classSolution:deftitleToNumber(self, columnTitle:str)->int:
num, multiple =0,1# 逆序计算,且为26进制for i inrange(len(columnTitle)-1,-1,-1):
k =ord(columnTitle[i])-ord("A")+1
num += k * multiple # 对每一个字符进行累加
multiple *=26return num
classSolution:# defaddToArrayForm(self, A: List[int], K:int)-> List[int]:
res =[]
i, carry =len(A)-1,0while i >=0or K !=0:
x = A[i]if i >=0else0
y = K %10if K !=0else0sum= x + y + carry
res.append(sum%10)
carry =sum//10
i -=1
K //=10if carry !=0:
res.append(carry)return res[::-1]# 法二:把K加到A中,从后往前依次拆分defaddToArrayForm(self, A: List[int], K:int)-> List[int]:
i =len(A)-1while K:
A[i]+= K
K, A[i]= A[i]//10, A[i]%10
i -=1if i <0and K:
A.insert(0,0)
i =0return A