字符串乘法

leetcode字符串乘法题目(大数乘法)

下面分别有我自己的解法和国外有个大佬的解法

package com.color.review01;

import java.util.Arrays;

public class MultiplyString {
    public String multiply1(String num1, String num2) {
        /**
         * 自己的做法
         */
        //把长度短的设置为num2,长的设置为num1
        if(num1.length()<num2.length()){
            String temp=num1;
            num1=num2;
            num2=temp;
        }
        //定义和初始化变量
        char[]cse=new char[num1.length()*2];
        Arrays.fill(cse,'0');
        StringBuilder str=new StringBuilder().append(cse);
        int carry=0;
        int cat=str.length()-1;
        //开始运算
        for(int i=num2.length()-1;i>=0;i--){
            int n2=num2.charAt(i)-'0';
            for(int j=num1.length()-1;j>=0;j--){
                int n1=num1.charAt(j)-'0';
                int c=str.charAt(cat)-'0';
                str.setCharAt(cat,(char)((n1*n2+c)%10+48));
                carry=(n1*n2+c)/10;
                int k=1;
                while(cat-k>=0&&carry!=0){
                    int ctmp=str.charAt(cat-k)-'0';
                    str.setCharAt(cat-k,(char)((ctmp+carry)%10+48));
                    carry=(carry+ctmp)/10;
                    k++;
                }
                cat--;
            }
            cat+=num1.length()-1;
        }
        //计算完毕,整理结果,把前面的多余0去掉
        String result=str.toString();
        while(result.length()>1&&result.charAt(0)=='0')result=result.substring(1);
        //返回结果值
        return result;
    }

    /**
     * 国外大佬的解法
     * @param num1
     * @param num2
     * @return
     */
    public String multiply2(String num1, String num2) {
        int m = num1.length(), n = num2.length();
        int[] pos = new int[m + n];

        for(int i = m - 1; i >= 0; i--) {
            for(int j = n - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int p1 = i + j, p2 = i + j + 1;
                int sum = mul + pos[p2];

                pos[p1] += sum / 10;
                pos[p2] = (sum) % 10;
            }
        }

        StringBuilder sb = new StringBuilder();
        for(int p : pos) if(!(sb.length() == 0 && p == 0)) sb.append(p);
        return sb.length() == 0 ? "0" : sb.toString();
    }

    public static void main(String[] args) {
        MultiplyString ms=new MultiplyString();
        String rs=ms.multiply2("999","999");
        System.out.println("result:"+rs);
    }
}

参考:国外大佬的解法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值