复数乘法
难度:
标签:
题目描述
复数 可以用字符串表示,遵循 "实部+虚部i"
的形式,并满足下述条件:
实部
是一个整数,取值范围是[-100, 100]
虚部
也是一个整数,取值范围是[-100, 100]
i2 == -1
给你两个字符串表示的复数 num1
和 num2
,请你遵循复数表示形式,返回表示它们乘积的字符串。
示例 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 的形式。
提示:
num1
和num2
都是有效的复数表示。
代码结果
运行时间: 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)
代码细节讲解
🦆
在解析复数时,如果输入的格式稍有不同,如多余的空格或特殊字符,该算法是否还能正确解析实部和虚部?
▷🦆
此算法如何处理虚部是负数的情况,比如输入是 '1+-1i',解析过程是否有特殊处理?
▷🦆
在计算复数乘法时,如何确保计算的结果在整数溢出范围内,尤其是当实部或虚部的值接近边界值时?
▷🦆
为什么在将计算结果重新组合成字符串时,没有考虑虚部为负数时输出格式的问题(例如输出为 '0+-2i' 而不是 '0-2i')?
▷