victory的博客

长安一片月,万户捣衣声

0%

leetcode | 43.字符串相乘

43.字符串相乘

题目描述

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

示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”

题目链接

思路

1.将num1、num2两个字符串转为整数相乘,然后将结果转为字符串返回
2.使用python内置函数eval()执行num1 * num2表达式,将eval函数返回结果转为字符串返回
3.做加法(详细思路见leetcode题解
4.做乘法(详细思路见leetcode题解

代码

class Solution(object):
    def multiply(self, num1, num2):
        """
        将num1、num2两个字符串转为整数相乘,然后将结果转为字符串返回

        :type num1: str
        :type num2: str
        :rtype: str
        """
        return str(int(num1) * int(num2))

    def multiply1(self, num1: str, num2: str) -> str:
        """
        将num1、num2两个字符串转为整数相乘,然后将结果转为字符串返回
        :param num1:
        :param num2:
        :return:
        """
        if num1 == "0" or num2 == "0":
            return "0"

        num1_to_int = 0
        num2_to_int = 0

        t = 1
        for i in range(1, len(num1)+1):
            num1_to_int += int(num1[-i]) * t
            t = t * 10

        t = 1
        for i in range(1, len(num2)+1):
            num2_to_int += int(num2[-i]) * t
            t = t * 10

        return str(num1_to_int * num2_to_int)

    def multiply2(self, num1: str, num2: str) -> str:
        """使用python内置函数eval()执行num1 * num2表达式,将eval函数返回结果转为字符串返回"""
        if num1 == "0" or num2 == "0":
            return "0"

        return str(eval(num1 + '*' + num2))  # eval() 函数用来执行一个字符串表达式,并返回表达式的值。

    def multiply3(self, num1: str, num2: str) -> str:
        """做加法"""
        if num1 == "0" or num2 == "0":
            return "0"

        ans = "0"
        m, n = len(num1), len(num2)
        for i in range(n - 1, -1, -1):
            add = 0
            y = int(num2[i])
            curr = ["0"] * (n - i - 1)  # num2除了最低位以外,其余的每一位的运算结果都需要补0
            print("curr:", curr)
            for j in range(m - 1, -1, -1):
                product = int(num1[j]) * y + add
                curr.append(str(product % 10))
                add = product // 10
            if add > 0:
                curr.append(str(add))
            curr = "".join(curr[::-1])
            ans = self.addStrings(ans, curr)
        return ans

    def addStrings(self, num1: str, num2: str) -> str:
        i, j = len(num1) - 1, len(num2) - 1
        add = 0
        ans = list()
        while i >= 0 or j >= 0 or add != 0:
            x = int(num1[i]) if i >= 0 else 0
            y = int(num2[j]) if j >= 0 else 0
            result = x + y + add
            ans.append(str(result % 10))
            add = result // 10
            i -= 1
            j -= 1
        return ''.join(ans[::-1])

    def multiply4(self, num1: str, num2: str) -> str:
        """做乘法"""
        if num1 == "0" or num2 == "0":
            return "0"

        m, n = len(num1), len(num2)
        ansArr = [0] * (m + n)
        for i in range(m - 1, -1, -1):
            x = int(num1[i])
            for j in range(n - 1, -1, -1):
                ansArr[i + j + 1] += x * int(num2[j])

        for i in range(m + n - 1, 0, -1):
            ansArr[i-1] += ansArr[i] // 10
            ansArr[i] %= 10

        index = 1 if ansArr[0] == 0 else 0
        ans = "".join(str(x) for x in ansArr[index:])
        return ans


if __name__ == "__main__":
    slt = Solution()
    result = slt.multiply4("12", "34")
    print(result)
    print(type(result))