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后端面试过程中的刷题笔记

全部评论

相关推荐

头像
昨天 15:46
已编辑
中南大学 后端
字节国际 电商后端 24k-35k
点赞 评论 收藏
分享
吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务