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
进行「实数」和「虚数」分割,按照法则运算后重新组成答案。
Java 代码:1
2
3
4
5
6
7
8
9class Solution {
public String complexNumberMultiply(String num1, String num2) {
String[] ss1 = num1.split("\\+|i"), ss2 = num2.split("\\+|i");
int a = Integer.parseInt(ss1[0]), b = Integer.parseInt(ss1[1]);
int c = Integer.parseInt(ss2[0]), d = Integer.parseInt(ss2[1]);
int A = a * c - b * d, B = b * c + a * d;
return A + "+" + B + "i";
}
}
C++ 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class Solution {
public:
string complexNumberMultiply(string num1, string num2) {
vector<string> ss1 = split(num1), ss2 = split(num2);
int a = stoi(ss1[0]), b = stoi(ss1[1]);
int c = stoi(ss2[0]), d = stoi(ss2[1]);
int A = a * c - b * d, B = b * c + a * d;
return to_string(A) + "+" + to_string(B) + "i";
}
vector<string> split(const string &s) {
vector<string> res;
string token;
for (char c : s) {
if (c == '+' || c == 'i') {
if (!token.empty()) {
res.push_back(token);
token.clear();
}
} else {
token += c;
}
}
return res;
}
};
Python 代码:1
2
3
4
5
6
7class Solution:
def complexNumberMultiply(self, num1: str, num2: str) -> str:
ss1, ss2, = re.split(r'\+|i', num1), re.split(r'\+|i', num2)
a, b = int(ss1[0]), int(ss1[1])
c, d = int(ss2[0]), int(ss2[1])
A, B = a * c - b * d, b * c + a * d
return f"{A}+{B}i"
TypeScript 代码:1
2
3
4
5
6
7function complexNumberMultiply(num1: string, num2: string): string {
const ss1 = num1.split(/\+|i/), ss2 = num2.split(/\+|i/);
const a = parseInt(ss1[0], 10), b = parseInt(ss1[1], 10);
const c = parseInt(ss2[0], 10), d = parseInt(ss2[1], 10);
const A = a * c - b * d, B = b * c + a * d;
return `${A}+${B}i`;
};
- 时间复杂度:令 $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 协议 ,转载请注明出处!