LC 537. 复数乘法

题目描述

这是 LeetCode 上的 537. 复数乘法 ,难度为 中等

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

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

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

示例 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 的形式。

提示:

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

模拟

本题考察的是「复数乘法法则」运用。

根据 $(a+bi)(c+di)=(ac-bd)+(bc+ad)i$,我们可以直接对 nums1nums2 进行「实数」和「虚数」分割,按照法则运算后重新组成答案。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
class 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 协议 ,转载请注明出处!