LC 537. 复数乘法
题目描述
这是 LeetCode 上的 537. 复数乘法 ,难度为 中等。
复数 可以用字符串表示,遵循 “实部+虚部i” 的形式,并满足下述条件:
- 实部 是一个整数,取值范围是 $[-100, 100]$
- 虚部 也是一个整数,取值范围是 $[-100, 100]$
- $i^2 == -1$
给你两个字符串表示的复数 num1
和 num2
,请你遵循复数表示形式,返回表示它们乘积的字符串。
示例 1:1
2
3
4
5输入:num1 = "1+1i", num2 = "1+1i"
输出:"0+2i"
解释:(1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i ,你需要将它转换为 0+2i 的形式。
示例 2:1
2
3
4
5输入:num1 = "1+-1i", num2 = "1+-1i"
输出:"0+-2i"
解释:(1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i ,你需要将它转换为 0+-2i 的形式。
提示:
num1
和num2
都是有效的复数表示。
模拟
本题考察的是「复数乘法法则」运用。
根据 $(a+bi)(c+di)=(ac-bd)+(bc+ad)i$,我们可以直接对 nums1
和 nums2
进行「实数」和「虚数」分割,按照法则运算后重新组成答案。
代码:1
2
3
4
5
6
7
8
9
10
11
12class Solution {
public String complexNumberMultiply(String num1, String num2) {
String[] ss1 = num1.split("\\+|i"), ss2 = num2.split("\\+|i");
int a = parse(ss1[0]), b = parse(ss1[1]);
int c = parse(ss2[0]), d = parse(ss2[1]);
int A = a * c - b * d, B = b * c + a * d;
return A + "+" + B + "i";
}
int parse(String s) {
return Integer.parseInt(s);
}
}
- 时间复杂度:令 $n$ 和 $m$ 分别为两字符串长度,复杂度上界取决于正则分割,正则复杂度与字符串长度呈正比,整体复杂度为 $O(n + m)$
- 空间复杂度:$O(n + m)$
最后
这是我们「刷穿 LeetCode」系列文章的第 No.537
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!