LeetCode——43. 字符串相乘

题目描述:【腾讯精选练习(50 题)】

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

示例 1:

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

示例 2:

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

说明:

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

解题思路:

两个字符串位数从右往左数,第一个数的第i位与第二个数的第j位相乘,会影响乘积的第i+j和第i+j-1位。单独求出结果乘积中的每一位,拼接为字符串即为最终结果。

解题代码:

class Solution {
	public String multiply(String num1, String num2) { // "123" "456"
		if ("0".equals(num1) || "0".equals(num2))
			return "0";

		int len1 = num1.length(), len2 = num2.length();
		int A[] = new int[len1 + len2];
		for (int i = len1 - 1; i >= 0; i--) {
			for (int j = len2 - 1; j >= 0; j--) {
				// A[3 + 3 - 2 - 2 - 2] += 3 * 6; // A[0] += 18;
				// A[3 + 3 - 2 - 2 - 1] += 3 * 5; // A[1] += 15;
				// A[3 + 3 - 2 - 2 - 0] += 3 * 4; // A[2] += 12;

				// A[3 + 3 - 2 - 1 - 2] += 2 * 6; // A[1] += 12;
				// A[3 + 3 - 2 - 1 - 1] += 2 * 5; // A[2] += 10;
				// A[3 + 3 - 2 - 1 - 0] += 2 * 4; // A[3] += 8;

				// A[3 + 3 - 2 - 0 - 2] += 1 * 6; // A[2] += 6;
				// A[3 + 3 - 2 - 0 - 1] += 1 * 5; // A[3] += 5;
				// A[3 + 3 - 2 - 0 - 0] += 1 * 4; // A[4] += 4;
				A[len1 + len2 - 2 - i - j] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
			}
		}

		// [18, 27, 28, 13, 4, 0]
		System.out.println(Arrays.toString(A));

		String result = "";
		for (int i = 0; i < len1 + len2; i++) {
			int div = A[i] / 10;
			int mod = A[i] % 10;
			if (div > 0) {
				A[i + 1] += div;
			}
			A[i] = mod;
			result = (char) (A[i] + '0') + result;
		}

		// 移除字符串前面的0
		return result.replaceAll("^(0+)", "");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值