必刷算法100题之字符串相乘

题目链接

43. 字符串相乘 - 力扣(LeetCode)

题目解析

给定俩个字符串形式的非负整数 num1 和 num2 ,返回俩个的乘积 

算法原理

解法一: "模拟"小学的列竖式运算

使用一个string ret="0" 用来记录我们的最终结果

1> 拿其中一位和另一个字符串的每一位相乘 -> 算出来的结果使用 String tmp来记录

2> 乘完后的结果累加

细节1: 高位相乘的时候, 要补上"0"

为了方便计算, 我们先把原始的字符串逆序, 然后我们根据下标是多少就补多少个0, 最后的结果也是逆序的, 需要逆序回来

细节2: 处理前导"0"

细节3" 注意计算结果的顺序

解法二: 对解法1进行优化->无进位相乘然后相加, 最后处理进位

1> 把原始的数组进行逆序

2> 结果不能用String来进行拼接,因为算出来的位数不止个位,如果直接拼接会出问题,因此我们用int[]来存储,数组长度为[m+n-1]

我们通过俩个字符串每一位的下标的和决定乘积的结果放在我们结果数组的哪个下标

然后俩层for循环, 如果下标里面有值, 就进行相加

最后处理进位: String ret

代码编写

解法2

class Solution {
    public String multiply(String sub1, String sub2) {
        //无进位相加
        //先把俩个字符串进行逆序操作
        //因为String没有reverse,所有我们转换位StringBuffer
        StringBuilder num1 = new StringBuilder(sub1);
        StringBuilder num2 = new StringBuilder(sub2);
        int n = num1.length();
        int m = num2.length();
        num1.reverse();
        num2.reverse();
        //处理一个为0的情况
        if ((num1.charAt(0) == '0' && n == 1) || (num2.charAt(0) == '0' && m == 1)) {
            return "0";
        }
        //最后的拼接出来的结果
        StringBuilder rs = new StringBuilder();
        //记录每一位累加的结果
        int[] tmp = new int[n + m];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                //计算结果下标
                int index = i + j;
                //计算结果,放进结果数组
                int muti = (num1.charAt(j) - '0') * (num2.charAt(i) - '0');
                //我们直接加进去
                tmp[index] += muti;
            }
        }
        //此时我们无进位乘法的所有结果加进去了, 我们来把每一位都进行进位处理
        int jinwei = 0;
        for (int i = 0; i < tmp.length; i++) {
            // %的结果放进rs
            rs.append((tmp[i] + jinwei) % 10);
            //更新进位
            jinwei = (tmp[i] + jinwei) / 10;
        }
        //如果最后有进位,我们要加进去
        if (jinwei != 0) {
            rs.append(jinwei);
        }
        //翻转为正常顺序, 处理前导0
        rs.reverse();
        int t = 0;
        for (int i = 0; i < rs.length(); i++) {
            if (rs.charAt(i) == '0') {
                continue;
            } else {
                t = i;
                break;
            }
        }
        return rs.toString().substring(t, rs.length());
    }
}

注意: 

1> 我们最后的进位是要加入的, 不然就少了一位

2> 我们的String 类型没有 reverse()方法,但是StringBuilder有, 因此我们进行翻转的时候需要转换为StringBuilder, StringBuilder s1 = new StringBuilder(字符串);

3> 计算下一位进位的时候, 我们需要把原先的进位加上让再进行计算

4> 处理前导0, 我们先进行翻转,然后找到不为0的位置即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值