深圳幻海软件技术有限公司 欢迎您!

算法leetcode|43. 字符串相乘(rust重拳出击)

2023-04-27

文章目录43.字符串相乘:样例1:样例2:提示:分析:题解:rustgoc++cpythonjava43.字符串相乘:给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的BigInteger库或直接将输入转换为整数

文章目录

  • 43. 字符串相乘:
    • 样例 1:
    • 样例 2:
    • 提示:
  • 分析:
  • 题解:
    • rust
    • go
    • c++
    • c
    • python
    • java


43. 字符串相乘:

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

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

样例 1:

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

输出: 
"6"
  • 1
  • 2
  • 3
  • 4
  • 5

样例 2:

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

输出: 
"56088"
  • 1
  • 2
  • 3
  • 4
  • 5

提示:

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

分析:

  • 面对这道算法题目,二当家的陷入了沉思。
  • 看了题意就是不允许我们直接将输入的两个数转成数字,然后直接用乘法API,那我们就模拟大数乘法就可以了。
  • 想起了小学做数学乘法,先学9*9乘法表,之后的乘法都是“分治”为个位数的乘法,再把结果加起来。

题解:

rust

impl Solution {
    pub fn multiply(num1: String, num2: String) -> String {
        if num1 == "0" || num2 == "0" {
            return "0".to_owned();
        }
        let (m, n) = (num1.len(), num2.len());
        let mut ans_arr = vec![0; m + n - 1];
        num1.as_bytes().iter().enumerate().for_each(|(i1, &c1)| {
            num2.as_bytes().iter().enumerate().for_each(|(i2, &c2)| {
                ans_arr[i1 + i2] += ((c1 - b'0') * (c2 - b'0')) as u16;
            });
        });
        let mut carry = 0;
        let mut ans = Vec::with_capacity(m + n);
        ans_arr.iter().rev().for_each(|&c| {
            let mut b = c + carry;
            carry = b / 10;
            b %= 10;
            ans.push(b as u8 + b'0');
        });
        if carry > 0 {
            ans.push(carry as u8 + b'0');
        }
        ans.reverse();
        String::from_utf8(ans).unwrap()
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

go

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 i1, c1 := range num1 {
for i2, c2 := range num2 {
ansArr[i1+i2+1] += int(c1-'0') * int(c2-'0')
}
}
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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

c++

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") {
            return "0";
        }
        int m = num1.size(), n = num2.size();
        auto ansArr = vector<int>(m + n);
        for (int i = m - 1; i >= 0; --i) {
            int x = num1.at(i) - '0';
            for (int j = n - 1; j >= 0; --j) {
                int y = num2.at(j) - '0';
                ansArr[i + j + 1] += x * y;
            }
        }
        for (int i = m + n - 1; i > 0; --i) {
            ansArr[i - 1] += ansArr[i] / 10;
            ansArr[i] %= 10;
        }
        int index = ansArr[0] == 0 ? 1 : 0;
        string ans;
        while (index < m + n) {
            ans.push_back(ansArr[index] + '0');
            index++;
        }
        return ans;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

c

char * multiply(char * num1, char * num2){
    int m = strlen(num1), n = strlen(num2);
    char *ans = malloc(sizeof(char) * (m + n + 3));
    memset(ans, 0, sizeof(char) * (m + n + 3));
    if ((m == 1 && num1[0] == '0') || (n == 1 && num2[0] == '0')) {
        ans[0] = '0', ans[1] = 0;
        return ans;
    }
    int *ansArr = malloc(sizeof(int) * (m + n + 3));
    memset(ansArr, 0, sizeof(int) * (m + n + 3));
    for (int i = m - 1; i >= 0; --i) {
        int x = num1[i] - '0';
        for (int j = n - 1; j >= 0; --j) {
            int y = num2[j] - '0';
            ansArr[i + j + 1] += x * y;
        }
    }
    for (int i = m + n - 1; i > 0; --i) {
        ansArr[i - 1] += ansArr[i] / 10;
        ansArr[i] %= 10;
    }
    int index = ansArr[0] == 0 ? 1 : 0;
    int ansLen = 0;
    while (index < m + n) {
        ans[ansLen++] = ansArr[index] + '0';
        ++index;
    }
    return ans;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

python

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        if num1 == "0" or num2 == "0":
            return "0"

        m, n = len(num1), len(num2)
        ans_arr = [0] * (m + n)
        for i in range(m - 1, -1, -1):
            x = int(num1[i])
            for j in range(n - 1, -1, -1):
                ans_arr[i + j + 1] += x * int(num2[j])

        for i in range(m + n - 1, 0, -1):
            ans_arr[i - 1] += ans_arr[i] // 10
            ans_arr[i] %= 10

        index = 1 if ans_arr[0] == 0 else 0
        ans = "".join(str(x) for x in ans_arr[index:])
        return ans

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

java

class Solution {
    public String multiply(String num1, String num2) {
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        int   m      = num1.length(), n = num2.length();
        int[] ansArr = new int[m + n - 1];
        for (int i = m - 1; i >= 0; --i) {
            int x = num1.charAt(i) - '0';
            for (int j = n - 1; j >= 0; --j) {
                int y = num2.charAt(j) - '0';
                ansArr[i + j] += x * y;
            }
        }
        StringBuilder ans   = new StringBuilder();
        int           carry = 0;
        for (int i = m + n - 2; i >= 0; --i) {
            int b = ansArr[i] + carry;
            carry = b / 10;
            b %= 10;
            ans.append(b);
        }
        if (carry > 0) {
            ans.append(carry);
        }
        return ans.reverse().toString();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


文章已被收录至官方知识档案
算法技能树leetcode-字符串43-字符串相乘45136 人正在系统学习中
二当家的白帽子
微信公众号
分享bit世界的一切