Medium

题目描述

复数可以用字符串表示,形式为 "real+imaginaryi",其中:

  • real 是实部,是范围 [-100, 100] 内的整数。
  • imaginary 是虚部,是范围 [-100, 100] 内的整数。
  • i² = -1

给定两个表示复数的字符串 num1num2,返回表示它们乘积的复数字符串。

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

约束条件:

  • num1num2 都是有效的复数。

解题思路

这道题考查复数乘法的数学运算和字符串解析。

解题思路:

  1. 字符串解析:首先需要从字符串中提取实部和虚部。可以通过找到 ‘+’ 号的位置来分割字符串,注意处理负数的情况。

  2. 复数乘法公式:对于两个复数 (a + bi)(c + di),它们的乘积为: (a + bi) * (c + di) = (ac - bd) + (ad + bc)i

    其中 i² = -1,所以 bd * i² 变成 -bd

  3. 字符串构造:将计算出的实部和虚部按照要求的格式拼接成结果字符串。

实现细节:

  • 解析时需要注意虚部前可能有负号
  • 虚部的 ‘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)只使用常数额外空间存储中间变量