LeetCode 43. 字符串相乘(Medium)/ 415. 字符串相加(Easy)/ 36进制加法 / 171. Excel 表列序号(E)/ 989. 数组形式的整数加法(E)/ 进制问题!!

题解

  1. 字符串相乘
  2. 字符串相加 (双指针,清晰图解)

思路

  • 字符串相乘
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 字符串相加
    在这里插入图片描述

代码

  • 字符串相乘
class Solution:
    ### 0210 模拟(124 ms,15 MB)
    def multiply(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 in range(m-1, -1, -1):
            for j in range(n-1, -1, -1):
                # 注意:这里使用+=来累加每一个对应数位的数字!
                arr[i+j+1] += int(num1[i]) * int(num2[j])
        
        # 注意:这里的结束下标为0,因为需要使用i-1!
        for i in range(m+n-1, 0, -1):
            # 这里先累加先获取低位的可能进位
            arr[i-1] += arr[i] // 10
            # 低位再对10求余得到此位上正确的值
            arr[i] %= 10
        
        # 注意:返回之前需要先判断两数之积的位数(即首位不能为0)!
        idx = 1 if arr[0] == 0 else 0

        return ''.join(str(num) for num in arr[idx:])
  • 字符串相加
class Solution:
    ### 0210 双指针模拟(56 ms,14.9 MB)
    def addStrings(self, num1: str, num2: str) -> str:
        m, n = len(num1), len(num2)
        num1, num2 = num1[::-1], num2[::-1]
        res, carry = [], 0

        for i in range(max(m, n)):
            a = int(num1[i]) if i < m else 0
            b = int(num2[i]) if i < n else 0

            cur = a + b + carry
            if cur < 10:
                res.append(str(cur))
                carry = 0
            else:
                res.append(str(cur%10))
                carry = cur // 10
            
        if carry != 0: res.append(str(carry))

        return ''.join(res[::-1])
def addStrings36(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 in range(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]) # 注意:返回时需要再次逆序返回!

171. Excel 表列序号

在这里插入图片描述

class Solution:
    def titleToNumber(self, columnTitle: str) -> int:
        num, multiple = 0, 1

        # 逆序计算,且为26进制
        for i in range(len(columnTitle) - 1, -1, -1):
            k = ord(columnTitle[i]) - ord("A") + 1
            num += k * multiple # 对每一个字符进行累加
            multiple *= 26

        return num

在这里插入图片描述

989. 数组形式的整数加法

在这里插入图片描述

class Solution:
    # 
    def addToArrayForm(self, A: List[int], K: int) -> List[int]:
        res = []
        i, carry = len(A) - 1, 0

        while i >= 0 or K != 0:
            x = A[i] if i >= 0 else 0
            y = K % 10 if K != 0 else 0

            sum = x + y + carry
            res.append(sum % 10)
            carry = sum // 10

            i -= 1
            K //= 10

        if carry != 0: 
            res.append(carry)

        return res[::-1]

	# 法二:把K加到A中,从后往前依次拆分
	def addToArrayForm(self, A: List[int], K: int) -> List[int]:
        i = len(A) - 1
        while K:
            A[i] += K
            K, A[i] = A[i] // 10, A[i] % 10
            i -= 1

            if i < 0 and K:
                A.insert(0,0)
                i = 0
        return A
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值