leetcode
leetcode 451 ~ 500
复数乘法

复数乘法

难度:

标签:

题目描述

复数 可以用字符串表示,遵循 "实部+虚部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 都是有效的复数表示。

代码结果

运行时间: 28 ms, 内存: 0.0 MB


/*
题目思路:
1. 将两个复数字符串解析为实部和虚部。
2. 使用复数乘法的公式 (a+bi)(c+di) = (ac - bd) + (ad + bc)i 计算乘积。
3. 使用Java Stream API和数组进行处理和计算。
4. 将结果转换为字符串格式,实部和虚部分别转换为字符串并返回。
*/
import java.util.Arrays;
 
public class ComplexNumberMultiplyStream {
    public static String complexNumberMultiply(String num1, String num2) {
        // 解析复数字符串为实部和虚部
        int[] complex1 = Arrays.stream(num1.split("\\+|i")).mapToInt(Integer::parseInt).toArray();
        int[] complex2 = Arrays.stream(num2.split("\\+|i")).mapToInt(Integer::parseInt).toArray();
 
        // 计算实部和虚部
        int realResult = complex1[0] * complex2[0] - complex1[1] * complex2[1];
        int imagResult = complex1[0] * complex2[1] + complex1[1] * complex2[0];
 
        // 返回结果
        return realResult + "+" + imagResult + "i";
    }
 
    public static void main(String[] args) {
        System.out.println(complexNumberMultiply("1+1i", "1+1i")); // 输出:0+2i
        System.out.println(complexNumberMultiply("1+-1i", "1+-1i")); // 输出:0+-2i
    }
}

解释

方法:

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

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在解析复数时,如果输入的格式稍有不同,如多余的空格或特殊字符,该算法是否还能正确解析实部和虚部?
该算法目前只能正确处理标准格式的复数输入(即没有额外空格或特殊字符的情况)。若输入格式中包含多余的空格或非标准字符,如空格或额外的符号,当前的字符串分割和解析方法可能会失败。为了增强算法的鲁棒性,可以在解析之前添加字符串的预处理步骤,如使用strip()方法去除前后空格,或者使用正则表达式来更精确地提取数字部分。
🦆
此算法如何处理虚部是负数的情况,比如输入是 '1+-1i',解析过程是否有特殊处理?
算法通过直接解析字符串并转换为整数来处理虚部为负数的情况。在Python中,int函数可以正确地将包含负号的字符串(如'-1')转换为负整数。因此,对于输入'1+-1i',在解析虚部时使用int(a.split('+')[1][0:-1])能够正确地将'+-1i'解析为-1。
🦆
在计算复数乘法时,如何确保计算的结果在整数溢出范围内,尤其是当实部或虚部的值接近边界值时?
在Python中,整数类型(int)是动态扩展的,可以处理非常大的数而不会发生溢出。这意味着当实部或虚部的值非常大时,Python可以自动管理这些大数的运算。然而,在其他一些编程语言中(如C++或Java),可能需要特别注意整数溢出的问题,并采用如长整型(long)或使用库函数等方法来避免溢出。
🦆
为什么在将计算结果重新组合成字符串时,没有考虑虚部为负数时输出格式的问题(例如输出为 '0+-2i' 而不是 '0-2i')?
这是代码实现上的一个疏忽。在将结果组合成字符串形式时,应该对虚部是否为负数进行检查,并相应地调整输出格式。例如,可以通过一个条件语句来判断虚部的正负,从而避免在虚部为负数时出现'+-'的情况。这将使输出更加符合数学习惯,提高代码的可读性和专业性。

相关问题