LeetCode 字符串相乘
Leetcode算法题库中的字符串相乘问题(Multiply Strings)是一道经典的题目,它提供了一个用于演示许多字符串操作的范例。本文将重点介绍如何解决这个问题,并给出Java实现。
题目描述
给定两个字符串 num1 和 num2,返回 num1 和 num2 的乘积,它们的长度分别为 m 和 n,且两个字符串只包含数字 0-9。你可以假设 num1 和 num2 都不会以零开头,并且你不能使用任何内置的大数库或直接将输入转换为整数。
示例
输入: num1 = "2", num2 = "3" 输出: "6"
输入: num1 = "123", num2 = "456" 输出: "56088"
算法分析
这道题使用传统手算乘法多位数乘法的方法,将字符串逆序后按位相乘,再整体相加。逐位乘积产生的进位直接累计到下一位中。最后,将结果逆序得到最终的答案。让我们以输入 num1 = “123”, num2 = “456” 举例说明。
首先,我们将两个字符串逆序,变成“321” 和 “654”。
| 6 | 5 4 |
|---|
|24
12 |18 3 |6
2 |8 8 1
将结果逆序再拼接起来就是最终答案: 56088。
代码实现
可以运用一个中间变量来储存两个字符串中的每一项所得的积值,比如 num1[i] 对应的数字与 num2[j] 对应的数字相乘的积值,digit[i+j],其中 i+j 是积值在 digit 中的索引。然后,我们将所有积值相加,得到最终的结果。
以下是Java代码,逐行注释解释了程序的工作原理。
class Solution
{ public String multiply(String num1, String num2)
{ int len1 = num1.length(), len2 = num2.length();
int[] digit = new int[len1+len2];
// 把 num1 和 num2 反转
num1 = new StringBuilder(num1).reverse().toString();
num2 = new StringBuilder(num2).reverse().toString();
// 先做乘法再处理进位
for(int i=0; i<len1; i++)
{ for(int j=0; j<len2; j++)
{ digit[i+j] += (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
} }
StringBuilder sb = new StringBuilder();
for(int i=0; i<digit.length; i++)
{ int carry = digit[i] / 10;
int remain = digit[i] % 10;
if (i+1 < digit.length)
{ digit[i+1] += carry; } sb.insert(0, remain); }
// 最后,去掉字符串开头的零
while (sb.length()>1 && sb.charAt(0)=='0')
{ sb.deleteCharAt(0); } return sb.toString();
} }
总结
字符串相乘的问题在编程中经常出现,其解决过程相对复杂,分别涉及到字符串的反转、数组的创建和查找等操作。希望本文中的讲解能对您有所帮助,并能够运用所学对其他涉及字符串操作的问题有更好的应用。