Leetcode-43. 字符串相乘

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)或直接将输入转换为整数来处理。

解题思路:我们需要利用程序模拟竖式相乘的过程
我们可以用一个数组来表示:res
图片说明 **
**最后我们只需要确认乘积在结果数组中的下标和i和j的关系即可

不难得出:num1【i】和num2【j】的乘积在res中的下标为i+j和i+j+1.其中(i+j+1为低位)
那么res最多有m+n位。我们求结果时需要先排除前边的0.
图片说明

class Solution {
    public String multiply(String num1, String num2) {
        int m=num1.length();
        int n=num2.length();
        int[] res=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+1;
                int p2=i+j;
                //累加结果到res数组:其中p1为低位下标,p2为高位
                int sum=res[p1]+mul;
                res[p1]=sum%10;
                res[p2]+=sum/10;
            }
        }
        //去除结果数组前侧的0
        int i=0;
        while(i<res.length && res[i]==0){
            i++;
        }
        //求得结果
        String str="";
        for(;i<res.length;i++){
            str+=res[i];
        }
        //如果字符串为空,应该返回0
        return str.length()==0?"0":str;
    }
}
Leetcode-牛客-刷题笔记 文章被收录于专栏

本专栏主要用于分享栏主在准备java后端面试过程中的刷题笔记

全部评论

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
10-15 10:57
已编辑
武昌理工学院 FPGA工程师
狠赚笔第一人:老哥学院本没实习还想拿13k学Java狠赚笔呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务