LeetCode-43.字符串相乘

博客围绕LeetCode中字符串相乘问题展开,给定两个以字符串表示的非负整数,要求返回其乘积的字符串形式,且不能用标准库大数类型或直接转整数处理。解题思路是将数拆分按位乘积,介绍了按位相乘结果在数组中的位置及存储方式,最后给出Java解题方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

示例 1:

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

示例 2:

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

说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解题思路—按位乘积:因为题目中要求不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理,所以只能将数拆分按位乘积。
下面举个例子来说明:123 × 12,num中的高位从0开始,即123的第0位为1,看下图
图
最上面一行multi是存储结果的数组,右边的数值是结果存放的索引值。num1的第i位和num2的第j位相乘的结果在multi中的位置是[i+j-1, i+j],因为设置multi数组的大小为num1.length+num2.length-1。 理论上两位数相乘,数组大小应该设置为num1.length+num2.length,这里为什么可以-1,是因为乘积中最高位的进位不用再单独分出去,可以直接与最高位放在一起。 接下来单独对每一位进行相乘,然后把结果存入相应的index中即可。

Java解题—按位乘积

class Solution {
    public String multiply(String num1, String num2) {
        if(num1==null || num1.length()==0 || num2==null || num2.length()==0)
            return "";

        if(num1.equals("0") || num2.equals("0"))
            return "0";

        // 保存最后的结果,123*9<123*10,而123*10要四位,所以123*9至多4位
        // -1是因为最高位的进位不用再单独分出去,可以直接与最高位放在一起
        int[] multi = new int[num1.length()+num2.length()-1];
        StringBuilder str = new StringBuilder();
        for(int i=num1.length()-1;i>=0;i--){
            for(int j=num2.length()-1;j>=0;j--){
                int number1 = num1.charAt(i)-48;
                int number2 = num2.charAt(j)-48;

                // 相同位置的数合并相加
                multi[i+j] += number1 * number2;
                if(multi[i+j]>=10 && (i+j)!=0){
                    multi[i+j-1] += multi[i+j]/10;
                    multi[i+j] = multi[i+j]%10;
                }
            }
        }
        for(int i=0;i<multi.length;i++)
            str.append(multi[i]);

        return str.toString();
    }
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值