1. 程式人生 > >LeetCode43字串相乘

LeetCode43字串相乘

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。

示例 1:

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

示例 2:

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

說明:

  1. num1 和 num2 的長度小於110。
  2. num1 和 num2 只包含數字 0-9
  3. num1 和 num2
     均不以零開頭,除非是數字 0 本身。
  4. 不能使用任何標準庫的大數型別(比如 BigInteger)直接將輸入轉換為整數來處理

 思路

通過字典將字串轉換成整數,然後再相乘,最後通過str()將整數再次轉換成字串。

class Solution():
    def multiply(self,num1,num2):
        dict={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
        if(num1=='0' or num2=='0'):
            return '0'
        n1=0
        n2=0
        for i in num1:
            tmp=dict[i]
            n1=n1*10+tmp
        for j in num2:
            tmp=dict[j]
            n2=n2*10+tmp
        res=n1*n2
        return str(res)
num1='234'
num2='123'
try1=Solution()
print(try1.multiply(num2,num1))

方法二:

解題思路:兩個非負數字字串的相乘。其實就是大數乘法。演算法的關鍵是要先將兩個字串翻轉過來,然後按位進行相乘,相乘後的數不要著急進位,而是儲存在一個數組裡面,然後將陣列中的數對10進行求餘(%),就是這一位的數,然後除以10,即/10,就是進位的數。注意最後要將相乘後的字串前面的0去掉。

按照上面的例子,最後結果也可能是3位,1乘以100,如果用array[4]來儲存的話,arr = [0,0,1,0]. ans最後會是0100,所以要把開頭的0去掉

class Solution():
    def multiply(self,num1,num2):
        num1=num1[::-1]
        num2=num2[::-1]
        array=[0 for i in range(len(num1)+len(num2))]
        for i in range(len(num1)):
            for j in range(len(num2)):
                array[i+j]+=int(num1(i))*int(num2(j))
        ans=[]
        for i in range(len(array)):
            d=array[i]%10
            c=array[i]//10
            if i <len(array)-1:
                array[i+1]+=c  #進位
            ans.insert(0,str(d)) #反向插入
        while ans[0]=='0' and len(ans)>1:
            del ans[0]
        return ''.join(ans)