从零开始刷Leetcode day14 字符串相乘(Clone Graph )

字符串相乘-java解法

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

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.

示例 1:

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

示例 2:

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

说明:

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

解法:

竖式相乘法:

竖式运算思想,以 num1 为 123,num2 为 456 为例分析
在这里插入图片描述
遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加。

注意:

num2 除了第一位的其他位与 num1 运算的结果需要 补0
计算字符串数字累加其实就是 415. 字符串相加

代码:

class Solution {
    public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")){
                return "0";
        }String res = "0";
        //如果两个数中有一个为0,则结果为0
        for(int i = num2.length()-1;i>=0;i--){
        	//从最低位到最高位,取nums2的每一位与nums1相乘
            StringBuilder temp = new StringBuilder();
            //新建sb保存每次的结果
            int carry = 0;
            //进位标识符
            for(int j = 0; j<num2.length()-i-1;j++){
                temp.append("0");
                //加0操作,因为是从最低位计算,最后字符串需要reverse(),所以0加在字符串最前面
            }
            int curN2 = num2.charAt(i)-'0';
            //从最低位到最高位取nums2的每一位
            for(int j = num1.length()-1;j>=0 || carry != 0;j--){
            	//n2与n1的每一位相乘,依然是从最低位到最高位
                int curN1  = j < 0 ? 0:num1.charAt(j)-'0';
                int cur = (curN1*curN2+carry) %10;
                //当前位置乘积后的数
                carry = (curN1*curN2+carry) /10;
                //当前位置进位标识符
                temp.append(cur);
                //存入当前位置
            }
            res = addString(res,temp.reverse().toString());
            //将每次n2的某一位与n1的乘积结果与之前的记录相加

        }return res;
    }private String addString(String num1,String  num2){
        StringBuilder temp = new StringBuilder();
        int carry = 0;
        for(int i = num1.length()-1, j = num2.length()-1;i>=0||j>=0||carry!=0;i--,j--){
        	//同上
            int n1 = i<0? 0:num1.charAt(i)-'0';
            int n2 = j<0? 0:num2.charAt(j)-'0';
            int sum = (carry+n1+n2)%10;
            carry = (carry+n1+n2)/10;
            temp.append(sum);

        }return temp.reverse().toString();
        //因为是从最低位到最高位存入的,所以最后需要reverse()
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值