LeetCode_Medium_43. Multiply Strings

2019.2.17

虽然考研可能要以失败告终了,不过终究只是人生一段经历而已,继续学习,可能过阵子就要去找工作了。。

Hello World ,

Keep Coding!

题目描述:

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.

Example 1:

Input: num1 = "2", num2 = "3"
Output: "6"

Example 2:

Input: num1 = "123", num2 = "456"
Output: "56088"

Note:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contain only digits 0-9.
  3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

这题是给定两个字符串形式的非负整数,然后求整数之积再以字符串的形式输出。本来我一看题目,这不就是把字符串再转换成整数再相乘将结果转换成字符串么,但是我写完提交后发现我想的太简单了,当测试用例是

"123456789"
"987654321"时就会出现overflow。想想也是,这么简单就做出来也不至于划到Medium题里去了,所以我又想了想,这没通过的测试用例不就等于是求大数相乘的题目嘛,那解法就很清晰了。

解法一:

其实就是小学数学乘法用代码表示出来,这里我找了一篇讲的很详细的blog,贴一下https://blog.csdn.net/afei__/article/details/83891547,原博用的是Java,我写一下C++代码。

C++代码:

class Solution {
public:
    string multiply(string a, string b) {
        int n1 = a.size(), n2 = b.size();
        vector<int> v(n1 + n2, 0);
        int k = n1 + n2 - 2;
        for(int i = 0; i < n1; ++i){
            for(int j = 0; j < n2; ++j){
                v[k-i-j] += (a[i] - '0') * (b[j] - '0');
            }
        }
        int c = 0;
        for(int i = 0; i < v.size(); ++i){
            v[i] += c;
            c = v[i] / 10;
            v[i] %= 10;
        }
        string res;
        for(int i = v.size() - 1; i >= 0; --i){
            res += to_string(v[i]);
        }
        
        int i = 0;
        while(i < res.size()){
            if(res[i] != '0'){
                break;
            }else{
                res = res.substr(i+1, res.size() - i - 1);
            }
        }
        if(res.size() == 0) return "0";
        return res;
    }
};

 

时间复杂度O(n1*n2) 

 

PS.看到讨论里有用Python直接 return str(int(num1)*int(num2))就通过的,还超过了99%的人。。

其实这样真的没必要,我认为刷LeetCode也是不断学习的过程,不断思考解决问题的方法,或者不断优化算法,就算真想不出来也可以参考其他blog,但是用这种方法通过测试我认为一点价值也没有。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值