『LeetCode|每日一题』---->字符串相乘

作者简介:

👨‍🎓一位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();

        }
    }
}

 

🍁 类似题目推荐:基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法练习资源:LeetCode;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)

  如果文章对你有帮助就支持一下噢,新手尝试,如有不好的地方请各位大佬多多指教!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值