Medium
题目描述
复数可以用字符串表示,形式为 "real+imaginaryi",其中:
real是实部,是范围[-100, 100]内的整数。imaginary是虚部,是范围[-100, 100]内的整数。i² = -1。
给定两个表示复数的字符串 num1 和 num2,返回表示它们乘积的复数字符串。
示例 1:
输入:num1 = "1+1i", num2 = "1+1i"
输出:"0+2i"
解释:(1 + i) * (1 + i) = 1 + i² + 2 * i = 2i,需要将其转换为 0+2i 的形式。
示例 2:
输入:num1 = "1+-1i", num2 = "1+-1i"
输出:"0+-2i"
解释:(1 - i) * (1 - i) = 1 + i² - 2 * i = -2i,需要将其转换为 0+-2i 的形式。
约束条件:
num1和num2都是有效的复数。
解题思路
这道题考查复数乘法的数学运算和字符串解析。
解题思路:
字符串解析:首先需要从字符串中提取实部和虚部。可以通过找到 ‘+’ 号的位置来分割字符串,注意处理负数的情况。
复数乘法公式:对于两个复数
(a + bi)和(c + di),它们的乘积为:(a + bi) * (c + di) = (ac - bd) + (ad + bc)i其中
i² = -1,所以bd * i²变成-bd。字符串构造:将计算出的实部和虚部按照要求的格式拼接成结果字符串。
实现细节:
- 解析时需要注意虚部前可能有负号
- 虚部的 ‘i’ 需要去掉才能转换为数字
- 结果格式要保持一致,即使虚部是负数也要用 ‘+’ 连接
这个问题的核心是正确解析输入字符串和应用复数乘法公式,时间复杂度为 O(1),因为字符串长度有限制。
代码实现
class Solution {
public:
string complexNumberMultiply(string num1, string num2) {
auto parse = [](const string& s) -> pair<int, int> {
int plus_pos = s.find('+', 1); // 从位置1开始找,避免开头的负号
int real = stoi(s.substr(0, plus_pos));
int imag = stoi(s.substr(plus_pos + 1, s.length() - plus_pos - 2)); // 去掉最后的'i'
return {real, imag};
};
auto [a, b] = parse(num1);
auto [c, d] = parse(num2);
int real_result = a * c - b * d;
int imag_result = a * d + b * c;
return to_string(real_result) + "+" + to_string(imag_result) + "i";
}
};
class Solution:
def complexNumberMultiply(self, num1: str, num2: str) -> str:
def parse(s):
plus_pos = s.find('+', 1) # 从位置1开始找,避免开头的负号
real = int(s[:plus_pos])
imag = int(s[plus_pos + 1:-1]) # 去掉最后的'i'
return real, imag
a, b = parse(num1)
c, d = parse(num2)
real_result = a * c - b * d
imag_result = a * d + b * c
return f"{real_result}+{imag_result}i"
public class Solution {
public string ComplexNumberMultiply(string num1, string num2) {
(int, int) Parse(string s) {
int plusPos = s.IndexOf('+', 1); // 从位置1开始找,避免开头的负号
int real = int.Parse(s.Substring(0, plusPos));
int imag = int.Parse(s.Substring(plusPos + 1, s.Length - plusPos - 2)); // 去掉最后的'i'
return (real, imag);
}
var (a, b) = Parse(num1);
var (c, d) = Parse(num2);
int realResult = a * c - b * d;
int imagResult = a * d + b * c;
return $"{realResult}+{imagResult}i";
}
}
var complexNumberMultiply = function(num1, num2) {
function parse(s) {
const plusPos = s.indexOf('+', 1); // 从位置1开始找,避免开头的负号
const real = parseInt(s.substring(0, plusPos));
const imag = parseInt(s.substring(plusPos + 1, s.length - 1)); // 去掉最后的'i'
return [real, imag];
}
const [a, b] = parse(num1);
const [c, d] = parse(num2);
const realResult = a * c - b * d;
const imagResult = a * d + b * c;
return `${realResult}+${imagResult}i`;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(1) | 字符串长度有限制,解析和计算都是常数时间 |
| 空间复杂度 | O(1) | 只使用常数额外空间存储中间变量 |