leetcode 537:复数乘法(JS)

233 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

题目

复数 可以用字符串表示,遵循 "实部+虚部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 都是有效的复数表示。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

乍一看还挺吓人,仔细看看就会发现其实就是简单的数学运算,交叉相乘;

关键点:合并同类项

那我们只要把每一项分成两个数组,然后进行两两互乘(有点像语法分析了),在互乘之后,可合并的同类项合并就行了;这里只要注意i^2 = -1,要将其和常数项进行合并

代码

var complexNumberMultiply = function(num1, num2) {
     // 把i去掉,常数相乘取负就可以表示了,同时以+号为分割点,转化为数组
    const arr1 = num1.replace('i','').split('+');
    const arr2 = num2.replace('i','').split('+');
    return ((arr1[0]*arr2[0])-(arr1[1]*arr2[1]))+'+'+((arr1[0]*arr2[1])+(arr2[0]*arr1[1]))+'i'
};

合并同类项是i^2直接用负号代替,而复数项其实就是自己来辨认了,比如这里的arr1[0]*arr2[1]arr2[0]*arr1[1],最后手动把i拼接在复数项上;完成式子。

思考

如果是一个无法辨认的式子呢?比如指数更高的未知数相乘,一个非常复杂的式子,人脑打草稿再手动拼未知数就显然不适用了

大概想了下放进数组不简单存一个值,而是存入一个描述该项的对象就好了,如(x+1)*(x²+x+1),式子展开是很复杂的,那么我们只要在数组中这样存[{temp:'x',const:'1'},{temp:'1',const:'1'}]就可以了。

在进行遍历计算时,把const和temp都互乘,得出该项,然后再根据未知数进行分组,同组合并同类项就行了

(马上12点了,赶时间发布就不贴代码了,有人看到有疑问再补吧)

顺带提一嘴

交叉相乘这里涉及到一个js的知识点,js字符串相乘会自动转化为数字相乘,若有非数字字符串相乘,结果则为NaN,即非数字:

   console.log('1'*'8') // 8
   console.log('a'*'8') // NaN

NaN不等于任何值,用isNaN可以校验

NaN===NaN // false
isNaN(NaN) // true

完事!