LeetCode 字符串相乘

265 阅读2分钟

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”。

65 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(); 
} }

总结

字符串相乘的问题在编程中经常出现,其解决过程相对复杂,分别涉及到字符串的反转、数组的创建和查找等操作。希望本文中的讲解能对您有所帮助,并能够运用所学对其他涉及字符串操作的问题有更好的应用。