算法:字符串相乘

 题目描述

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

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

//字符串相乘

//做加法 1234 * 567
func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }

    ans := "0"
    m, n := len(num1), len(num2)

    //遍历字符串num2
    for i := n - 1; i >= 0; i-- {
        curr := ""
        //进位
        add := 0

        for j := n - 1; j > i; j-- {
            curr += "0"
        }

        //转换为整数
        y := int(num2[i] - '0')

        //做乘法
        for j := m - 1; j >= 0; j-- {
            //转换为整数
            x := int(num1[j] - '0')

            product := x * y + add
            //itoa 整形转换为字符串
            //curr 为对应的每一位数
            curr = strconv.Itoa(product % 10) + curr
            add = product / 10
        }

        //处理最后一个进位
        for ; add != 0; add /= 10 {
            curr = strconv.Itoa(add % 10) + curr
        }

        ans = addStrings(ans, curr)
    }

    return ans
}


func addStrings(num1, num2 string) string {
    i, j := len(num1) - 1, len(num2) - 1
    add := 0
    ans := ""
    //add 也要判断
    for ; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 {
        x, y := 0, 0
        if i >= 0 {
            x = int(num1[i] - '0')
        }
        if j >= 0 {
            y = int(num2[j] - '0')
        }
        result := x + y + add
        ans = strconv.Itoa(result % 10) + ans
        add = result / 10
    }
    return ans
}


//做乘法
func multiply(num1 string, num2 string) string {
    if num1 == "0" || num2 == "0" {
        return "0"
    }

    m, n := len(num1), len(num2)
    ansArr := make([]int, m + n)

    for i := m - 1; i >= 0; i-- {
        x := int(num1[i]) - '0'
        for j := n - 1; j >= 0; j-- {
            y := int(num2[j] - '0')
            //相乘
            ansArr[i + j + 1] += x * y
        }
    }

    for i := m + n - 1; i > 0; i-- {
        ansArr[i - 1] += ansArr[i] / 10
        ansArr[i] %= 10
    }

    //存储最终结果
    ans := ""
    idx := 0
    if ansArr[0] == 0 {
        idx = 1
    }
    for ; idx < m + n; idx++ {
        //整形转换为字符串
        ans += strconv.Itoa(ansArr[idx])
    }

    return ans
}

参考链接:https://leetcode-cn.com/problems/multiply-strings/solution/zi-fu-chuan-xiang-cheng-by-

上一篇:一首歌的时间看懂荷兰三色旗问题


下一篇:算法---LeetCode 235. 二叉搜索树的最近公共祖先(同剑指offer 68-1)