leetcode-537

537. Complex Number Multiplication

实现一个复数乘法

1
2
3
Input: "1+1i", "1+1i"
Output: "0+2i"
Explanation: (1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i, and you need convert it to the form of 0+2i.

大部分时间都花在写正则匹配实部和虚部了

两个复数
$a + bi$, $c + di$

$(a + bi) * (c + di) = (ac - bd) + (bc + ad)i$

使用三个辅助变量

$$\begin{cases}
t_1 = (a - b) (c + d) \
t_2 = a
d \
t_3 = b * c \
\end{cases},$$

$(a + bi) * (c + di) = (t_1 - t_2 + t_3) + (t_2 + t_3)i$

这样可以把四次乘法减少到三次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string complexNumberMultiply(string a, string b)
{
regex complex_regex("(.*?)\\+(.*?)i");
int a_real = 0;
int a_imaginary = 0;

int b_real = 0;
int b_imaginary = 0;

smatch a_complex_match;
if (std::regex_search(a, a_complex_match, complex_regex))
{
a_real = stoi(a_complex_match[1]);
a_imaginary = stoi(a_complex_match[2]);
}

smatch b_complex_match;
if (std::regex_search(b, b_complex_match, complex_regex))
{
b_real = stoi(b_complex_match[1]);
b_imaginary = stoi(b_complex_match[2]);
}

int t1 = (a_real - a_imaginary) * (b_real + b_imaginary);
int t2 = (a_real * b_imaginary);
int t3 = (a_imaginary * b_real);

return to_string(t1 - t2 + t3) + "+" + to_string(t2 + t3) + "i";
}

再看看leetcode上其他人写的代码

用stringstream来读取实部和虚部

-1+-2i

-1 + -2 +
int char int char

aa >> ra >> buff >> ia >> buff

1
2
3
4
5
6
7
8
9
string complexNumberMultiply(string a, string b) {
stringstream aa(a), bb(b), ans;
int ra, ia, rb, ib;
char buff;
aa >> ra >> buff >> ia >> buff;
bb >> rb >> buff >> ib >> buff;
ans << ra * rb - ia * ib <<"+" << ra * ib + rb * ia << "i";
return ans.str();
}

参照这份代码对我的代码做一些修改,去掉正则部分,改用stringstream, 最终代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string complexNumberMultiply(string a, string b)
{
int a_real, a_imaginary = 0;
int b_real, b_imaginary = 0;
char buff;

stringstream ss_a(a);
stringstream ss_b(b);
ss_a >> a_real >> buff >> a_imaginary;
ss_b >> b_real >> buff >> b_imaginary;

int t1 = (a_real - a_imaginary) * (b_real + b_imaginary);
int t2 = (a_real * b_imaginary);
int t3 = (a_imaginary * b_real);

return to_string(t1 - t2 + t3) + "+" + to_string(t2 + t3) + "i";
}