LeetCode:43. Multiply Strings (Medium)
1. 原题链接
https://leetcode.com/problems/multiply-strings/description/
2. 题目要求
给定两个String类型的正整数num1、num2,返回它们的String类型乘积
(1)num1和num2的长度都小于110;
(2)num1、num2都只包含0-9之间的字符;
(3)num1、num2的首位都不为0;
(4)不能使用BigInteger,也不能字符串转直接换成整数类型
3. 解题思路
首先题目要求不能直接将String转换成Integer,但我们可以利用“char-'0'”的方式将其强制转换成int类型,然后进行相乘。
例如下图中,num1=“123”,num2=“45”,首先创建一个整型数组num[ ]来保存每一位的结果,两数相乘的乘积长度肯定不超过这两个数的长度之和。这里的每一位指个、十、百、千...
使用两层for循环分别对两个字符串num1和num2进行遍历。
第一次遍历,num1.charAt(i) 得到‘3’,num2.charAt(j) 得到‘5’。使用num1.charAt(i) -'0'将char类型的‘3’转换成int类型的3,对num2进行同样的操作,用mul保存二者乘积。
然后用数组num[ ]来保存每一位的结果,指针p1=i+j、p2=i+j+1分别指向数组中两个连续的位置。此时p2位于数组的最后一位,保存个位上的数字。p1是数组的倒数第二位,保存十位上的数字。
在此之前,我们要确定个位、十位上的数字。sum保存两个数的乘积mul+个位上原有的数字(个位上原有数字为0),对sum整除10得到十位上的数字,sum对10取模得到个位上的数字。
两层for循环完成后,最终的num[ ]数组里就保存了二者乘积的每一位上的结果
然后将数组的元素取出来,转换成String类型,就得到了最终的结果
4.代码实现
public class MultiplyStrings43 { public static void main(String[] args) { String num2 = "12345465656565"; String num1 = "4556"; System.out.println(multiply(num1, num2)); } public static String multiply(String num1, String num2) { int m = num1.length(), n = num2.length(); int[] pos = new int[m + n]; // 用数组来保存不同位上的结果 for (int i = m - 1; i >= 0; i--) { for (int j = n - 1; j >= 0; j--) { int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); //-'0'强制转换成int类型 int p1 = i + j, p2 = i + j + 1; int sum = mul + pos[p2]; pos[p1] += sum / 10; pos[p2] = (sum) % 10; } } StringBuilder sb = new StringBuilder(); for (int p : pos) { // 将最后的乘积数组转换成String类型 if (!(sb.length() == 0 && p == 0)) sb.append(p); } return sb.length() == 0 ? "0" : sb.toString(); } }