LeetCode 537题解:复数乘法的C++高效实现与代码解析

一、题目解读
LeetCode 537题要求实现两个复数的乘法,输入为形如"a+bi"的字符串,需输出乘积的复数形式。题目核心在于解析字符串中的实部与虚部,并应用复数乘法公式计算结果。
二、解题思路
采用分治思想:首先通过自定义parseComplex函数解析两个复数的实部与虚部,再利用复数乘法公式(a+bi)(c+di)=(ac-bd)+(ad+bc)i计算实部与虚部,最后拼接结果字符串。关键在于利用字符串操作定位"+"和"i"的位置,提取数值并转换。
三、解题步骤
1. 解析输入:调用parseComplex两次,分别获取num1和num2的实部(a/c)与虚部(b/d)。
2. 计算乘积:按公式计算real=(ac-bd),imag=(ad+bc)。
3. 构造输出:将real与imag转换为字符串,拼接为"real+imagi"格式。
四、代码与注释
class Solution {
public:
string complexNumberMultiply(string num1, string num2) {
// 解析第一个复数的实部和虚部
auto [a, b] = parseComplex(num1);
// 解析第二个复数的实部和虚部
auto [c, d] = parseComplex(num2);
// 计算实部和虚部
int real = a * c - b * d;
int imag = a * d + b * c;
// 构造结果字符串
return to_string(real) + "+" + to_string(imag) + "i";
}
// 辅助函数:解析复数字符串
pair<int, int> parseComplex(const string& num) {
// 找到'+'和'i'的位置
size_t plus_pos = num.find('+');
size_t i_pos = num.find('i');
// 提取实部和虚部
int real = stoi(num.substr(0, plus_pos));
int imag = stoi(num.substr(plus_pos + 1, i_pos - plus_pos - 1));
return {real, imag};
}
};注释说明:
● parseComplex通过find定位符号位置,利用substr截取数值并转换,减少手动遍历开销。
● 主函数直接应用公式,避免中间变量冗余。
五、总结
该解法通过精准的字符串解析与公式直接计算,兼具简洁性与效率。核心技巧在于利用C++的find与substr快速定位数值,避免复杂分割逻辑。适合处理中等长度复数乘法问题,时间复杂度O(N)(N为字符串长度)。
原创内容 转载请注明出处




