LeeCode 43. 字符串相乘 Multiply Strings
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
提示:
1 <= num1.length, num2.length <= 200num1和num2只能由数字组成。num1和num2都不包含任何前导零,除了数字0本身。
难度:中等
思路:
模拟按位乘的过程,因为是两个数相乘,大概率是一个双层循环。
因为本身输入是一个字符串,不是数字,而且不让直接转数字,所以不能作为整体来操作,只能按照char来操作,来通过提取相对于'0'的偏移量取得对应数字。
123*456,分解成子任务,
类似是先处理123*6,再把结果保存下来用于下步操作。
并且位之间要对的上。
难点在于用什么东西,怎么把每次的中间结果记录下来。
有个特性就是,两个数字的长度m和n,m*n,其实最大不会超过m+n,比如m,n都是1, 9*9,最大不会超过100。
所以用m+n大小的数组来保存是够的。
public static String multiply(String num1, String num2) { int m = num1.length(); int 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'); //可能上一次计算有进位被存储了 int sum = mul + pos[i + j + 1]; //10机制,当前位的取模数,用于进位 pos[i + j + 1] = sum % 10; //当前位的余数,而且要加上上次存储的进位 pos[i + j] += sum / 10; } } StringBuilder sb = new StringBuilder(); //如果第一位没有发生进位就会是0,本身m+n是可能的结果空间大小 for (int p : pos) if (!(sb.length() == 0 && p == 0)) sb.append(p); // 避免开头的0 return sb.length() == 0 ? "0" : sb.toString(); }
这个方法是从chatgpt那偷的,比官方攻略里的代码少也更好理解,
感觉这个思路和实现不错,记录一下。
浙公网安备 33010602011771号