leetcode:字符串相乘

leetcode:字符串相乘

描述:

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

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

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

思想

乘法的底层逻辑是加法,两个数相乘,从其中一个数的个位数开始,也就是字符串的最右边,依次和另一个数的个位数开始乘,计算出的结果取模10,得到余数,每次计算把余数加上。

代码

        public static String multiply(String num1, String num2) {
	        if (num1.equals("0") || num2.equals("0")) {
	            return "0";
	        }
	        // 保存计算结果
	        String res = "0";
	        
	        // num2 逐位与 num1 相乘
	        for (int i = num2.length() - 1; i >= 0; i--) {
	            int carry = 0;
	            // 保存 num2 第i位数字与 num1 相乘的结果
	            StringBuilder temp = new StringBuilder();
	            // 补 0 
	            for (int j = 0; j < num2.length() - 1 - i; j++) {
	                temp.append(0);
	            }
	            int n2 = num2.charAt(i) - '0';
	            
	            // num2 的第 i 位数字 n2 与 num1 相乘
	            for (int j = num1.length() - 1; j >= 0 || carry != 0; j--) {
	                int n1 = j < 0 ? 0 : num1.charAt(j) - '0';
	                int product = (n1 * n2 + carry) % 10;
	                temp.append(product);
	                carry = (n1 * n2 + carry) / 10;
	            }
	            // 将当前结果与新计算的结果求和作为新的结果
	            res = addStrings(res, temp.reverse().toString());
	        }
	        return res;
	    }

	    /**
	     * 对两个字符串数字进行相加,返回字符串形式的和
	     */
	    public static String addStrings(String num1, String num2) {
	        StringBuilder builder = new StringBuilder();
	        int carry = 0;
	        for (int i = num1.length() - 1, j = num2.length() - 1;
	             i >= 0 || j >= 0 || carry != 0;
	             i--, j--) {
	            int x = i < 0 ? 0 : num1.charAt(i) - '0';
	            int y = j < 0 ? 0 : num2.charAt(j) - '0';
	            int sum = (x + y + carry) % 10;
	            builder.append(sum);
	            carry = (x + y + carry) / 10;
	        }
	        return builder.reverse().toString();
	    }

分析

  • 时间复杂度:O(M N)。M,NM,N 分别为 num1num2 的长度。
  • 空间复杂度:O(M+N)。用于存储计算结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值