复数乘法

标签: 数学 字符串 模拟

难度: Medium

复数 可以用字符串表示,遵循 "实部+虚部i" 的形式,并满足下述条件:

  • 实部 是一个整数,取值范围是 [-100, 100]
  • 虚部 也是一个整数,取值范围是 [-100, 100]
  • i2 == -1

给你两个字符串表示的复数 num1num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。

 

示例 1:

输入:num1 = "1+1i", num2 = "1+1i"
输出:"0+2i"
解释:(1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i ,你需要将它转换为 0+2i 的形式。

示例 2:

输入:num1 = "1+-1i", num2 = "1+-1i"
输出:"0+-2i"
解释:(1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i ,你需要将它转换为 0+-2i 的形式。 

 

提示:

  • num1num2 都是有效的复数表示。

Submission

运行时间: 28 ms

内存: 0.0 MB

class Solution:
    def complexNumberMultiply(self, a: str, b: str) -> str:
        aReal, aImg = int(a.split('+')[0]), int(a.split('+')[1][0:-1])
        bReal, bImg = int(b.split('+')[0]), int(b.split('+')[1][0:-1])
        
        resReal = aReal * bReal - aImg * bImg
        resImg  = aReal * bImg + aImg * bReal
        
        res = str(resReal) + '+' + str(resImg) + 'i'
        
        return res
        
        

Explain

本题解的思路是先将输入的两个复数字符串分别拆分成实部和虚部,然后根据复数乘法的规则 (a+bi) * (c+di) = (ac-bd) + (bc+ad)i 计算乘积的实部和虚部。最后,将计算得到的实部和虚部重新组合成复数的字符串形式返回。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def complexNumberMultiply(self, a: str, b: str) -> str:
        # 提取复数a的实部和虚部
        aReal, aImg = int(a.split('+')[0]), int(a.split('+')[1][0:-1])
        # 提取复数b的实部和虚部
        bReal, bImg = int(b.split('+')[0]), int(b.split('+')[1][0:-1])
        
        # 计算乘积的实部和虚部
        resReal = aReal * bReal - aImg * bImg
        resImg  = aReal * bImg + aImg * bReal
        
        # 将实部和虚部组合成字符串形式的复数
        res = str(resReal) + '+' + str(resImg) + 'i'
        
        return res

Explore

该算法目前只能正确处理标准格式的复数输入(即没有额外空格或特殊字符的情况)。若输入格式中包含多余的空格或非标准字符,如空格或额外的符号,当前的字符串分割和解析方法可能会失败。为了增强算法的鲁棒性,可以在解析之前添加字符串的预处理步骤,如使用strip()方法去除前后空格,或者使用正则表达式来更精确地提取数字部分。

算法通过直接解析字符串并转换为整数来处理虚部为负数的情况。在Python中,int函数可以正确地将包含负号的字符串(如'-1')转换为负整数。因此,对于输入'1+-1i',在解析虚部时使用int(a.split('+')[1][0:-1])能够正确地将'+-1i'解析为-1。

在Python中,整数类型(int)是动态扩展的,可以处理非常大的数而不会发生溢出。这意味着当实部或虚部的值非常大时,Python可以自动管理这些大数的运算。然而,在其他一些编程语言中(如C++或Java),可能需要特别注意整数溢出的问题,并采用如长整型(long)或使用库函数等方法来避免溢出。

这是代码实现上的一个疏忽。在将结果组合成字符串形式时,应该对虚部是否为负数进行检查,并相应地调整输出格式。例如,可以通过一个条件语句来判断虚部的正负,从而避免在虚部为负数时出现'+-'的情况。这将使输出更加符合数学习惯,提高代码的可读性和专业性。