leetcode刷题记录-537. 复数乘法

200 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

前言

今日的题目为中等,但是实实在在的是一道特别简单的题目,不知道为什么被评定为中等题,因为哪怕是复数的计算,应该也是以前考试写了好多计算题的了,应该是没有什么难度。

每日一题

今天的每日一题 537. 复数乘法,难度为中等

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

  • 实部 是一个整数,取值范围是 [-100, 100]
  • 虚部 也是一个整数,取值范围是 [-100, 100]
  • i2 == -1
  • 给你两个字符串表示的复数 num1 和 num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。

 

示例 1:

输入:num1 = "1+1i", num2 = "1+1i"
输出:"0+2i"
解释:(1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i ,你需要将它转换为 0+2i 的形式。

示例 2:

输入:num1 = "1+-1i", num2 = "1+-1i"
输出:"0+-2i"
解释:(1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i ,你需要将它转换为 0+-2i 的形式。 

 

提示:

  • num1 和 num2 都是有效的复数表示。

题解

复数乘法

今天的题目为超级简单题,主要就是考察到了高中的复数知识,让我们先来稍微介绍一下什么是复数。

关于复数的定义大家可以移步百度百科 -- 复数

复数其实就是表示再二维平面上的一个向量

image.png

然后我们可以找到用于复数的乘法公式:

设z1=a+bi,z2=c+di(a、b、c、d∈**R**)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i。

也不难理解,我们把两个复数相乘当作 (a+b)*(c+d) 展开就是 ac+ad+bc+bd ,然后 i^2 会等于 -1,这样我们就能够做一个相加的计算。

题解

既然我们知道的复数的乘法规则,并且题目给了我们两个复数字符串,那么我们就只需要去做一个切割,拿到题目给我们的复数的实部和虚部,然后做一个相乘的计算,最后将得到的答案用复数的格式拼接成字符串就是题目需要的答案了。

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
 var complexNumberMultiply = function(num1, num2) {
    const complex1 = [num1.split("+")[0], num1.split("+")[1].split("i")[0]];
    const complex2 = [num2.split("+")[0], num2.split("+")[1].split("i")[0]];
    const realPart1 = parseInt(complex1[0]);
    const imagPart1 = parseInt(complex1[1]);
    const realPart2 = parseInt(complex2[0]);
    const imagPart2 = parseInt(complex2[1]);
    return '' + realPart1 * realPart2 - imagPart1 * imagPart2 
            + '+' + (realPart1 * imagPart2 + imagPart1 * realPart2) + 'i';
};

image.png