给定两个以字符串形式表示的非负整数num1num2,返回num1num2的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

  • num1 和 num2 的长度小于110。
  • num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如BigInteger)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解1 2021/9/6 O(?)

def multiply(num1: str, num2: str) -> str:
    '''
        38397
    *     123
    ---------
       115191
       76794    //这里可以和上面加起来,算出来一个加一个
      38397
    ---------
      4722831
    '''
    # 短的放下面,一样长不管
    len1=num1.__len__()
    len2=num2.__len__()
    if len2>len1:
        tmp=num1
        num1=num2
        num2=tmp
    len1=num1.__len__()
    len2=num2.__len__()
    # 题目限制num1、num2只包含0-9,所以非空
    if len2==1:
        if num2[0]=='0': return num2
        if num2[0]=='1': return num1
    res=[]
    for idx,x in enumerate(num2[::-1]):
        jinwei=0
        sum=[]
        for y in num1[::-1]:
            v=int(x)*int(y)+jinwei
            jinwei=v//10
            v=v%10
            sum.insert(0,v)
        sum.insert(0,jinwei)
        # 补零
        for z in range(0,idx):
            sum.append(0)
        # print(sum)
        if res.__len__()==0:
            res=sum
        else:
            # 补零
            res.insert(0,0)
            jinwei=0
            res_len=res.__len__()
            for i in range(res_len-1,-1,-1):
                v=res[i]+sum[i]+jinwei
                res[i]=v%10
                jinwei=v//10
            if jinwei: res.insert(0,jinwei)
        # print(res)
    res_str=''
    # 去掉头部的零
    if res[0]==0:res=res[1:]
    for x in res:
        res_str+=str(x)
    return res_str

if __name__ == '__main__':
    print(multiply('123','38397'))
    print(multiply('2','3'))
    print(multiply('123','456'))

Leetcode - 43. 字符串相乘_编程题