LeetCode Multiply Strings

54 篇文章 0 订阅
19 篇文章 0 订阅

原题链接在这里:https://leetcode.com/problems/multiply-strings/

Method 1: 通过这道题,学到了BigInteger的用法, 他的constructor 可以直接从string建立BigInteger, 但要注意它的乘法API是 bi1.multiply(bi2).

若是中间需要考虑溢出,还有bi1.intValue(), bi1.longValue()等API.

Method 2: 若num1.length() = m, num2.length() = n, 那么结果的长度为m+n-1(没有进位),或者是m+n(有进位)。没有进位时, 结果对应的i位等于 (num1的1位 * num2的i位 + num1的2位 * num2的i-1位 + ... + num1的i位 * num2的1位)%10. 当然 前提是不能有溢出。为了方便计算与理解,可以先反转两个string,最后计算的结果的most significant位在最后,所 以需要反转回来。

AC Java:

import java.math.*;
public class Solution {
    public String multiply(String num1, String num2) {
        /*Method 1
        if(num1 == null || num2 == null || num1.length() ==0 || num2.length() == 0)
            return "";
        BigInteger bi1 = new BigInteger(num1);
        BigInteger bi2 = new BigInteger(num2);
        
        BigInteger res = bi1.multiply(bi2);
        return res.toString();
        */
        
        //Method 2
        if(num1 == null || num2 == null || num1.length() ==0 || num2.length() == 0)
            return "";
        if(num1.charAt(0) == '0'||num2.charAt(0) == '0'){
            return "0"; //error
        }
        
        int len1 = num1.length();
        int len2 = num2.length();
        num1 = new StringBuilder(num1).reverse().toString(); //error
        num2 = new StringBuilder(num2).reverse().toString();
        StringBuilder res = new StringBuilder();
        
        int carryDig = 0;
        for(int i = 0; i < len1+len2-1; i++){
            int mul = 0;
            for(int j = 0; j<=i; j++){
                if(j<len1 && (i-j)<len2){
                    mul += (int)(num1.charAt(j)-'0') * (int)(num2.charAt(i-j)-'0');
                }   
            }
            mul += carryDig;
            res.append(mul%10);
            carryDig = mul/10;
        }
        
        if(carryDig != 0){
            res.append(carryDig);
        }
        
        return res.reverse().toString();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值