欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 43. Multiply Strings

程序员文章站 2022-03-23 13:14:04
...

对于python3来说,有两种解法。第一种因为有长整型,不用考虑整型的溢出,所以可以直接这么写:

# solution1 python有长整型,所以不用担心溢出
    def char_to_int(self, char):
        integers = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
        return integers[char]
      
    def int_to_char(self, integer):
        chars = {0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9'}
        return chars[integer]
        
    def multiply(self, num1: str, num2: str) -> str:
        # string 转 int
        level = 10**(len(num1)-1)
        num1_int = 0
        for num in num1:
            num1_int += self.char_to_int(num) * level
            level //= 10
        level = 10**(len(num2)-1)
        num2_int = 0
        for num in num2:
            num2_int += self.char_to_int(num) * level
            level //= 10
         
        num_ans_int = num1_int * num2_int

        # int 转 string
        num_ans = ""
        while num_ans_int/10 !=0:
            num_ans = self.int_to_char(num_ans_int%10) + num_ans
            num_ans_int = num_ans_int // 10
        if num_ans == "":
            num_ans = "0"
        return num_ans

第二种解法,假设python 没有长整型:

按照两数相乘的过程,来计算。计算可以分成两部分,用 123456*7654321 来举例:

分为计算红线左边和红线右边

leetcode 43. Multiply Strings

    def multiply(self, num1:str, num2:str) ->str:
        # 计算红线右边
        num_ans = ""
        last = 0
        for i1 in range(1,len(num1)+1):
            m1 = len(num1) - i1
            temp = last
            for i2 in range(min(i1,len(num2))):
                m2 = len(num2) - i2 -1
                temp += self.char_to_int(num1[m1+i2]) * self.char_to_int(num2[m2])
            last = temp // 10
            num_ans = self.int_to_char(temp%10) + num_ans
        
        #计算红线左边
        for i2 in range(1,len(num2)):
            m2 = len(num2) - i2 -1
            temp = last
            for m1 in range(min(m2+1,len(num1))):
                temp+= self.char_to_int(num1[m1]) * self.char_to_int(num2[m2-m1])
            last = temp // 10
            num_ans = self.int_to_char(temp%10) + num_ans
        while last/10 !=0:
            num_ans = self.int_to_char(last%10) + num_ans
            last = last // 10
        
        # 一些边缘情况
        if num_ans =="":
            return "0"
        change = True
        for num in num_ans:
            if num == "0":
                pass
            else:
                change = False
                break
        if change:
            num_ans = "0"
        return num_ans

 

相关标签: leetcode