[leetcode-43]Multiply Strings(java)

问题描述:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值