您的位置:首页 > 其它

LeetCode - Multiply Strings

2015-03-30 00:51 344 查看
https://leetcode.com/problems/multiply-strings/

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.
这道题是把乘法转换成每一位相乘,然后把结果加到对应位上。
因为长度分别为len1, len2的两个数相乘,结果不会超过len1+len2,所以先用一个整型数组来保存结果。

两个数中下标为i, j的位相乘的结果应该对应到结果数组中的 i+j+1位,并且如果有进位,进位的值对应到i+j位甚至更小的位,加的时候要注意进位的问题。注意,这里下标越大,在整数中对应越低的位。

最后把整型数组输出到StringBuilder中,注意,如果结果为0的话,那么整型数组所有数都是0。则直接返回“0”就行了。

代码如下:

public String multiply(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
if(len1==0 || len2==0) return "";
int[] a = new int[len1+len2];
Arrays.fill(a, 0);
for(int i=len1-1; i>=0; i--){
for(int j = len2-1; j>=0; j--){
int d1 = num1.charAt(i)-'0';
int d2 = num2.charAt(j)-'0';
int rst = d1*d2;
int carry = (a[i+j+1]+rst)/10;
a[i+j+1] = (a[i+j+1]+rst)%10;

int index = i+j;
while(carry!=0){
int nrst = a[index]+carry;
carry = nrst/10;
a[index] = nrst%10;
index--;
}
}
}
StringBuilder val = new StringBuilder();
int i = 0;
while(i<a.length && a[i] == 0) i++;
if(i==a.length) return "0";
while(i<a.length){
val.append(a[i]);
i++;
}
return val.toString();
}


时间复杂度是 O(len1*len2),考虑进位的时间的话应该是O(len1*len2*(len1+len2)),但进位一般进不了这么多,所以这是worst case。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: