作者简介:
👨🎓一位20级的计科专业的新手,请各位大佬多多指教
🏡个人主页:XiaoChen_Android
📚学习专栏:LeetCode
🕒发布日期:2022/8/3
『LeetCode|每日一题』 字符串相乘
1.每日一题
2.解题思路
2.1思路分析
解法一: S1:首先分析特殊情况,两个数任意一个为0则返回0;
S2:由于题目要求不能用内置BigInteger和直接将输入转化为整数计算,所以想到了我们熟悉的竖式计算;
S3:需要创建一个数组来存储每位计算的结果,两位数相乘结果不会超过两位数的位数之和,所以数组大小为(l1 + l2);
S4:以下图为例,此时需要计算每位数的乘法结果,应从最后一位开始取,计算结果放在下标为i + j + 1的数组中,从而得到了{0,5,16,34,52,45,28}这个数组,由于计算结果只有6位,而数组长度为7,所以第0的位置应为0,不可忽略这个情况;
S5:此时需要对没一位来进行进位,ans[i] / 10即为向前一位的进位,ans[i] % 10即为该位最后的结果;
S6:最后一位一位取出数组里的结果,此时要注意第一位是否为0,如果为0,则从下标为1的位置开始取结果,取出的结果通过StringBuilder的方法在末尾拼接从而得出答案。
ans[i + j + 1] += m * n-----> 4的下标为3,7的下标为2,计算结果28的下标为6,所以计算结果的下标为i + j + 1;
//判断从下标为0开始取还是下标为1开始
int index;
// if(ans[0] == 0){
// index = 1;
// }else index = 0;
index = ans[0] == 0 ? 1 : 0;
2.2 核心代码
for(int i = l1 - 1;i >= 0;i--){
int m = num1.charAt(i) - '0';
for(int j = l2 - 1;j >= 0;j--){
int n = num2.charAt(j) - '0';
ans[i + j + 1] += m * n;
}
}
for(int i = l1 + l2 - 1;i > 0;i--){
ans[i - 1] += ans[i] / 10; //计算进位
ans[i] = ans[i] % 10; //计算该位的结果
}
2.3 全部代码
class Solution {
public String multiply(String num1, String num2) {
if(num1.equals("0") || num2.equals("0")){
return "0";
}
int l1 = num1.length();
int l2 = num2.length();
int[] ans = new int[l1 + l2];
for(int i = l1 - 1;i >= 0;i--){
int m = num1.charAt(i) - '0';
for(int j = l2 - 1;j >= 0;j--){
int n = num2.charAt(j) - '0';
ans[i + j + 1] += m * n;
}
}
for(int i = l1 + l2 - 1;i > 0;i--){
ans[i - 1] += ans[i] / 10;
ans[i] = ans[i] % 10;
}
StringBuilder sb = new StringBuilder();
int index;
// if(ans[0] == 0){
// index = 0;
// }else index = 1;
index = ans[0] == 0 ? 1 : 0;
while(index < l1 + l2){
sb.append(ans[index]);
index++;
}
return sb.toString();
}
}
2.4 解法二
个人不推荐第二种解法!!
import java.math.BigDecimal;
class Solution {
public String multiply(String num1, String num2) {
if(num1 == "0" || num2 == "0"){
return "0";
}else {
BigDecimal bigDecimal1 = new BigDecimal(num1);
BigDecimal bigDecimal2 = new BigDecimal(num2);
BigDecimal ans = bigDecimal1.multiply(bigDecimal2);
return ans.toString();
}
}
}
如果文章对你有帮助就支持一下噢,新手尝试,如有不好的地方请各位大佬多多指教!