[leetcode-43]Multiply Strings(java)

来源:互联网 发布:浅谈人工智能 编辑:程序博客网 时间:2024/05/21 03:19

问题描述:
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;    }}
0 0
原创粉丝点击