【LeetCode】每日一题 537. 复数乘法

227 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

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 都是有效的复数表示。

解题思路

方法一:
  分别获取[a1, b1][a2, b2]
  简单模拟,计算出新的ab即可
​
方法二:
  两个复数相乘,展开
​
  实部、虚部对应相乘得到的是实部
  实部与虚部交叉相乘,得到的是虚部
  
方法三:
  正则表达式
  
方法四:
  字符串解析成实部、虚部,然后应用多项式乘多项式展开,得到最终的实部、虚部

代码实现

// 方法一
const complexNumberMultiply = (num1, num2) => {
  const [a1, b1] = getNum(num1);
  const [a2, b2] = getNum(num2);
​
  const a = a1 * a2 - b1 * b2;
  const b = a1 * b2 + a2 * b1;
​
  return `${a}+${b}i`
};
​
const getNum = strNum => {
  const str = strNum.slice(0, strNum.length - 1);
  const [a, b] = str.split('+');
  return [Number(a), Number(b)];
};
​
// 方法二
var complexNumberMultiply = function(num1, num2) {
    const str1 = num1.split('+'),str2 = num2.split('+');
    const b = str1[0]*parseInt(str2[1]) + parseInt(str1[1])*str2[0],
        a = str1[0]*str2[0]-parseInt(str1[1]) * parseInt(str2[1]);
    return `${a}+${b}i`;
}
​
// 方法三
var complexNumberMultiply = function(a, b) {
    let reg1 = /-?\d+/g, reg2 = /[+-]/g;
    let arr1 = a.match(reg1), arr2 = b.match(reg1);
    let ans  = arr1[0]*arr2[0] - arr1[1]*arr2[1] + '+' + (arr1[0]*arr2[1] + arr1[1]*arr2[0] + 'i');
    return ans;
};
​
// 方法四
/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var complexNumberMultiply = function(num1, num2) {
    convert = function(num) {
        let isA = true, neg = false, a = 0, b = 0
        for(let i = 0; i < num.length; i++)
            if(num.charAt(i) == '-')
                neg = true
            else if(num.charAt(i) == '+' || num.charAt(i) == 'i') {
                if(neg)
                    if(isA)
                        a *= -1
                    else
                        b *= -1
                isA = neg = false
            } else if(isA)
                a = 10 * a + num.charCodeAt(i) - '0'.charCodeAt(0)
            else
                b = 10 * b + num.charCodeAt(i) - '0'.charCodeAt(0)
        return [a, b]
    }
​
    const n1 = convert(num1), n2 = convert(num2)
    return "" + (n1[0] * n2[0] - n1[1] * n2[1]) + "+" + (n1[1] * n2[0] + n1[0] * n2[1]) + "i"
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;