LeetCode-43.字符串相乘

题目

给定两个以字符串形式表示的非负整数 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();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值