Leetcode43 字符串相乘

Leetcode43 字符串相乘问题

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:

输入: num1 = “123”, num2 = “456”
输出: “56088”

思路:模拟小学数学的列竖式计算,思考的点在于每个位置的数乘过之后最终的位置在哪以及进位情况,自己模拟一下12*34,看不出来规律的话再试试55*67

class Solution {
    public String multiply(String num1, String num2) {
        int len1=num1.length();
        int len2=num2.length();
        int[]dp=new int[len1+len2];
       //从最低位到最高位,sum是当前i,j位置乘积+之前可能也计算过相同位置的值,放置的位置在i+j+1处,因为m位数*n位数得到的数最大是m+n位。
      //进位直接进到前一位存着就行
        for(int i=len1-1;i>=0;i--){
            for(int j=len2-1;j>=0;j--){
                int sum=(num1.charAt(i)-'0')*(num2.charAt(j)-'0')+dp[i+j+1];
                int remain=sum%10;
                int carry=sum/10;
                dp[i+j+1]=remain;
                dp[i+j]+=carry;
            }
        }
      //这边开始去除首位的0
        int start=len1+len2-1;;
        for(int i=0;i<len1+len2;i++){
            if(dp[i]!=0){
                start=i;
                break;
            }
        }
        StringBuilder s=new StringBuilder();
        for(int j=start;j<len1+len2;j++){
            s.append(dp[j]);
        }
        return s.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值