问题描述:
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.
分析:分别构造两个函数,一个是计算字符串与单个字符的乘积。一个是一个字符串与一个字符串相加的和。注意,还有有个记录错位的标记。
这里,要特别注意的是怎么从从整数变成字符,例如:
res.append((char)(carry+48));这个地方如果没有强制类型转换,那么就是错误的了。
而从字符变成int时,只要减48即可。48是’0‘的ASCII,这一点似乎不如C语言里面的直观。
代码如下:432ms
public class Solution {
public String multiply(String num1, String num2) {
StringBuffer resBuffer;
StringBuffer baseBuffer;
if(num1==""||num2=="")
return "";
int num2Len = num2.length();
baseBuffer = multiplyWithChar(num1,num2.charAt(num2Len-1));
for(int i = num2Len-2;i>=0;i--){
resBuffer = multiplyWithChar(num1,num2.charAt(i));//反的
baseBuffer = addString(baseBuffer,resBuffer,num2Len-i-1);//反着加
}
//再反转
baseBuffer.reverse();
//从前向后除去多余0
int i;
int tmpLen = baseBuffer.length();
for(i = 0;i<tmpLen;i++){
if(baseBuffer.charAt(i)!='0')
break;
}
if(i==tmpLen)
return "0";
baseBuffer.delete(0,i);
return baseBuffer.toString();
}
private StringBuffer addString(StringBuffer baseBuffer,StringBuffer unBaseBuffer,int index){
int baseLen = baseBuffer.length();
int unBaseLen = unBaseBuffer.length();
char[] baseChar = baseBuffer.toString().toCharArray();
char[] unBaseChar = unBaseBuffer.toString().toCharArray();
StringBuffer res = new StringBuffer();
for(int i = 0;i<index;i++)
res.append(baseChar[i]);
int baseIndex = index;
int unBaseIndex = 0;
int carry = 0;
while(baseIndex<baseLen||unBaseIndex<unBaseLen){
char base;
char unBase;
int tmpVal = 0;
if(baseIndex<baseLen) {
base = baseChar[baseIndex++];
tmpVal += base - 48;
}
if(unBaseIndex<unBaseLen) {
unBase = unBaseChar[unBaseIndex++];
tmpVal += unBase - 48;
}
tmpVal += carry;
carry = tmpVal/10;
res.append((char)(tmpVal%10+48));
}
if(carry!=0)
res.append((char)(carry+48));
return res;
}
private StringBuffer multiplyWithChar(String num1,char c){
StringBuffer res = new StringBuffer();
char[] numChar = num1.toCharArray();
int val = c-48;
int base;
int carry = 0;
int tmpVal;
if(val==0)
{
res.append('0');
return res;
}
for(int i = numChar.length-1;i>=0;i--){
base = numChar[i]-48;
tmpVal = base*val+carry;
base = tmpVal%10;
carry = tmpVal/10;
res.append((char)(base+48));
}
if(carry>0)
res.append((char)(carry+48));
return res;
}
}