您的位置:首页 > 其它

Leetcode-Multiply Strings

2014-11-21 03:22 267 查看
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.

Have you met this question in a real interview?

Solutiion:
a[i]*b[j] is the value of c[i+j]. So we have

Iter a[i]
iter b[j]
c[i+j] = a[i]*b[j]+c[i+j]
carry = c[i+j]/10;
c[i+j] = c[i+j]%10;
c[i+j+1] += carry. //NOTE: because we are dealing with string, we need to manipulate the char directly, after adding carry to c[i+j+1], c[i+j+1] may be larger than 10. Therefore, we need to keep dealing with carry, until in some higher bit, the carry becomes 0!

public class Solution {
public String multiply(String num1, String num2) {
if (num1.isEmpty() || num2.isEmpty()) return "";
if (num1.equals("0") || num2.equals("0")) return "0";
if (num1.equals("1")) return num2;
if (num2.equals("1")) return num1;

StringBuilder b1 = new StringBuilder(num1);
StringBuilder b2 = new StringBuilder(num2);
b1.reverse();
b2.reverse();
StringBuilder b3 = new StringBuilder();

//perform multiplication bit by bit;
for (int i=0;i<b1.length();i++){
char c1 = b1.charAt(i);
for (int j=0;j<b2.length();j++){
char c2 = b2.charAt(j);
int val = (c1-'0')*(c2-'0');
if (b3.length()>(i+j)) val += b3.charAt(i+j)-'0';
int carry = val/10;
val = val % 10;
//put val of current bit into string.
if (b3.length()>(i+j))
b3.replace(i+j,i+j+1,Integer.toString(val));
else b3.append((char)(val+'0'));

//put carry into (i+j+1) bit.
if (carry==0) continue;
int curBit = i+j+1;
while (carry!=0){
if (b3.length()>curBit){
val = (b3.charAt(curBit)-'0')+carry;
carry = val / 10;
val = val%10;
b3.replace(curBit,curBit+1,Integer.toString(val));
curBit++;
} else {
b3.append((char)(carry+'0'));
carry = 0;
}
}
}
}

b3.reverse();

return b3.toString();
}
}


Solution2:

Directly use char arry. It is faster than StringBuilder.

public class Solution {
public String multiply(String num1, String num2) {
if (num1.isEmpty() || num2.isEmpty()) return "";
if (num1.equals("0") || num2.equals("0")) return "0";
if (num1.equals("1")) return num2;
if (num2.equals("1")) return num1;

StringBuilder temp = new StringBuilder(num1);
temp.reverse();
char[] b1 = temp.toString().toCharArray();
temp = new StringBuilder(num2);
temp.reverse();
char[] b2 = temp.toString().toCharArray();
char[] b3 = new char[b1.length+b2.length];
Arrays.fill(b3,'0');

//perform multiplication bit by bit;
for (int i=0;i<b1.length;i++){
char c1 = b1[i];
for (int j=0;j<b2.length;j++){
char c2 = b2[j];
int val = (c1-'0')*(c2-'0') + (b3[i+j]-'0');
int carry = val/10;
val = val % 10;
//put val of current bit into string.
b3[i+j] = (char) (val+'0');

//put carry into (i+j+1) bit.
if (carry==0) continue;
int curBit = i+j+1;
while (carry!=0){
val = (b3[curBit]-'0')+carry;
carry = val / 10;
val = val%10;
b3[curBit] = (char)(val+'0');
curBit++;
}
}
}

temp = new StringBuilder();
int index = b3.length-1;
for (int i=b3.length-1;i>=0;i--)
if (b3[i]!='0'){
index = i;
break;
}
for (int i=index;i>=0;i--) temp.append(b3[i]);

return temp.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: