数据结构与算法之字符串: LeetCode 43. 字符串相乘 (Ts版)

字符串相乘

  • https://leetcode.cn/problems/multiply-strings/description/

描述

  • 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式

  • 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数

示例 1

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2

输入: num1 = "123", num2 = "456"
输出: "56088"

提示

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成
  • num1 和 num2 都不包含任何前导零,除了数字0本身

Typescript 版算法实现


1 ) 方案1:做加法

function multiply(num1: string, num2: string): string {
    if (num1 === "0" || num2 === "0") return "0";

    let ans = "0";
    const m = num1.length;
    const n = num2.length;

    for (let i = n - 1; i >= 0; i--) {
        let curr = "";
        let carry = 0;

        // 添加适当的零位
        for (let j = n - 1; j > i; j--) {
            curr += "0";
        }

        const y = parseInt(num2.charAt(i), 10);

        for (let j = m - 1; j >= 0; j--) {
            const x = parseInt(num1.charAt(j), 10);
            const product = x * y + carry;

            curr = (product % 10).toString() + curr;
            carry = Math.floor(product / 10);
        }

        while (carry !== 0) {
            curr = (carry % 10).toString() + curr;
            carry = Math.floor(carry / 10);
        }

        ans = addStrings(ans, curr);
    }

    return ans;
}

function addStrings(num1: string, num2: string): string {
    let i = num1.length - 1;
    let j = num2.length - 1;
    let carry = 0;
    let result = "";

    while (i >= 0 || j >= 0 || carry !== 0) {
        const x = i >= 0 ? parseInt(num1.charAt(i), 10) : 0;
        const y = j >= 0 ? parseInt(num2.charAt(j), 10) : 0;
        const sum = x + y + carry;

        result = (sum % 10).toString() + result;
        carry = Math.floor(sum / 10);

        i--;
        j--;
    }

    return result;
}

2 ) 方案2:做乘法

function multiply(num1: string, num2: string): string {
    if (num1 === "0" || num2 === "0") return "0";

    const m = num1.length;
    const n = num2.length;
    const ansArr: number[] = new Array(m + n).fill(0);

    // 计算每一位的乘积并累加到 ansArr 中
    for (let i = m - 1; i >= 0; i--) {
        const x = parseInt(num1.charAt(i), 10);
        for (let j = n - 1; j >= 0; j--) {
            const y = parseInt(num2.charAt(j), 10);
            ansArr[i + j + 1] += x * y;
        }
    }

    // 处理进位
    for (let i = m + n - 1; i > 0; i--) {
        ansArr[i - 1] += Math.floor(ansArr[i] / 10);
        ansArr[i] %= 10;
    }

    // 构建最终结果字符串
    let ans = "";
    let idx = 0;
    if (ansArr[0] === 0) {
        idx = 1;
    }
    for (; idx < m + n; idx++) {
        ans += ansArr[idx].toString();
    }
    return ans;
}

你可能感兴趣的:(Data,Structure,and,Algorithms,leetcode,算法)