43. 字符串相乘

123 阅读4分钟

【题目】

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

注意: 不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

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

示例 2:

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

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

【题目解析】

思路

针对这一问题,我们采用了一种手动模拟数字乘法的方法,详细步骤如下:

  1. 字符到整数的转换:通过遍历字符串中的每个字符,并利用字符与其ASCII码之间的关系,手动将字符串表示的数字转换为整数。
  2. 乘法操作:在获得两个整数之后,进行乘法运算得到乘积。
  3. 整数到字符串的转换:将乘积转换回字符串形式以满足输出要求。

这种方法的核心在于避免直接使用语言内置的类型转换和大数处理功能,而是通过基础的字符串和数值操作来实现需求。

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        # 初始化两个数字为0
        num1_int, num2_int = 0, 0
        
        # 将num1转换为整数
        for digit in num1:
            num1_int = num1_int * 10 + (ord(digit) - ord('0'))
        
        # 将num2转换为整数
        for digit in num2:
            num2_int = num2_int * 10 + (ord(digit) - ord('0'))
        
        # 计算乘积
        product = num1_int * num2_int
        
        # 将乘积转换为字符串并返回
        return str(product)

执行

image.png

【总结】

适用问题类型

此方法适用于处理大数问题,尤其是当题目要求不能直接使用内置函数或库进行类型转换和大数运算时。除了字符串相乘,它也适用于其他需要精确控制数字操作的场景,如大数加法、减法,或者在不支持大数直接操作的编程环境中处理数值数据。

解决算法

  • 核心思想:通过遍历字符串,利用ASCII码值手动将字符串转换为整数,执行乘法运算,最后将结果转换回字符串。

  • 步骤细化

    1. 初始化两个整数变量用于存储转换后的数值。
    2. 遍历每个输入字符串,对每个字符进行ASCII码转换,累加到整数变量中。
    3. 使用得到的两个整数进行乘法运算。
    4. 将乘积转换为字符串形式返回。

算法特点

  • 无需大数库:完全手动实现从字符串到整数的转换,避免使用任何内置大数处理功能,满足题目要求。
  • 灵活可控:通过基础操作精确控制转换和计算过程,增强了处理大数问题的灵活性和可控性。
  • 广泛适用:此方法不仅限于乘法,同样适用于其他需要手动处理数字字符串的场景。

算法优化与实践意义

  • 优化策略:尽管这种方法在处理大数时非常有效,但对于更复杂的数学运算,如除法或大数开方,可能需要更专门的算法。优化的关键在于减少不必要的重复计算和提高转换效率。
  • 实践意义:掌握这种基础的手动数字处理方法对于深入理解计算机如何处理数字和字符有重要意义。在不支持或限制使用高级数值处理功能的环境中,这种方法提供了一种有效的解决方案。此外,它还有助于提高编程技巧,尤其是在需要精确控制数值运算过程的应用开发中。

总之,手动数值转换与乘法算法展示了一种基于字符串和基本数学原理来解决大数问题的方法。这种方法虽然简单,但却非常强大,能够在满足特定编程约束的同时,有效处理复杂的数值运算问题。

题目链接

字符串相乘