建网站收费多少钱,公众号怎么发文章,海淀做网站公司,团队氛围建设 网站43. 字符串相乘 - 力扣#xff08;LeetCode#xff09; 给定两个以字符串形式表示的非负整数 num1 和 num2#xff0c;返回 num1 和 num2 的乘积#xff0c;它们的乘积也表示为字符串形式。 注意#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例…43. 字符串相乘 - 力扣LeetCode 给定两个以字符串形式表示的非负整数 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本身。 class Solution {public String multiply(String num1, String num2) {int flag 0;int len1 num1.length();int len2 num2.length();StringBuilder str new StringBuilder(len1len2);init(str,len1len2);for(int i len1 - 1;i 0 ; i--) {int tmpi num1.charAt(i) - 0;int j 0;for(j len2 - 1; j 0 ; j--) {int index (len1-i-1)(len2-1-j);int tmp str.charAt(index) - 0;int tmpj num2.charAt(j) - 0;tmp tmp tmpi*tmpj flag;flag tmp/10;tmp % 10;str.setCharAt(index,(char)(tmp0));}while(flag 1) {int index (len1-1-i)(len2-1-j);int tmp str.charAt(index) - 0;tmp tmpflag;flag tmp/10;tmp%10; str.setCharAt(index,(char)(tmp0));j--;}} int len len1len2-1;while(str.charAt(len) 0) {if(len 0) break;str.delete(len,len1);len--;}str.reverse();return str.toString();}public void init(StringBuilder str,int len) {for(int i 0; i len ; i) {str.append(0);}}
} 今天是一道中等题。这道题是有关于字符串的实际上跟大数乘法的方法相类似。如果能够搞懂这道题那么大数乘法大数加法应该就都没有问题了。 读完题目发现这道题要求我们对两个字符串进行相乘的操作。题目要求不能直接将给的字符串转成数字。所以需要使用大数乘法。相加是处理运算完数字放的位置以及有无进位问题。而乘法则是在加法的基础上多加一个两个数的乘数而已。 第一个难点位置。运算完的数字应该放在哪个位置我们需要先了解一下乘法。i位数乘j位数。第0位乘第0位放在第0位第0位乘第1位放在第1位第1位乘第1位放在第2位。这里认为数字最低位是第0位那么发现了吗乘法i位*j位是放在i*j位上的。 第二个难点进位问题。如果是加法那么产生的进位不会超过1。但是乘法有可能产生1-9的进位所以在判定是否进位时需要使用1来判断不再是1来判断。 那么整体就出来了。i位数*j位数最多产生ij位的数我们创建ij位的StringBuild用来放结果。flag 用于记录是否有进位。进入循环后每位相乘index计算运算完的数字应该放在哪个位置。而%10操作可以判断进完位的余数/10的操作可以判断进位的个数。最后如果有超过两数位数的进位就单独处理。由于使用append所以结果相反返回之前需要reverse一下。 如果有其他解法也可以发在评论区。