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:
- The length of both
num1
andnum2
is < 110. - Both
num1
andnum2
contain only digits0-9
. - Both
num1
andnum2
do not contain any leading zero, except the number 0 itself. - 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,但是用这种方法通过测试我认为一点价值也没有。。。