leetcode----43. Multiply Strings

链接:

https://leetcode.com/problems/multiply-strings/

大意:

给定两个大数(以字符串的形式给定),输出两个大数的乘积(也以字符串形式表示)。规定:给定的两个大数,都为正数,除非是"0",否则这两个数都不可能是以0开头的数。例子:

思路:

手动模拟乘法。

首先判断特殊情况:num1或者num2为"",则返回"0"

将两个字符串的字符数组转成对应的int数组n1,n2。并初始化一个大小为n1.length+n2.length+1的整数数组res,用于存放乘积最终结果的每一位数字。之后便是模拟乘法操作了。拿 123(n1) * 456(n2) 举例:

首先是n1的每一位和6乘(即n1首先和n2的最后一位相乘),并放入到res的对应位置。在这一步,又可以细分:首先是n1的最后一位和n2的最后一位相乘,得到18,这个数字应该放在res.length - 1位置上,而之前res.length - 1位置上的值是0。也就是加上该位置原来的数仍为18。而一个位置上只能保留一位数,所以18 % 10=8;另外18 / 10=1,用作下一位的进位(其实这一步也用了进位,只是进位一开始初始化为0);接着是n1的倒数第二个数2乘以6,此时光是2乘6可以得到12,再加上前一位的进位1可以得到13,再加上该位置原来的数(0)为13,所以放置在该位置上的数为3,并再向前进1。最后,1乘以6,加上进位,加上原来的值,最终为7;下一阶段便是123*5(只不过一开始放置在res中的位置比前一步左移了一位),继续考虑进位以及该位置上的值...

最后,应注意的是:当最后一位乘完之后,我们需判断有没有进位,如果有,直接保留到res中对应的位置。(感觉看代码更容易理解...)

代码:

class Solution {
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0"))
            return "0";
        int[] n1 = new int[num1.length()], n2 = new int[num2.length()], res = new int[n1.length + n2.length + 1];
        int i = 0;
        for (char c : num1.toCharArray()) {
            n1[i++] = c - '0';
        }
        i = 0;
        for (char c : num2.toCharArray()) {
            n2[i++] = c - '0';
        }
        // n1 * n2  i1:n1的当前位置  i2:n2的当前位置
        int index = res.length - 1, j = 0, i2 = n2.length - 1; // index为res当前应该修改的位置  j 表示进位值
        while (i2 >= 0) {
            int i1 = n1.length - 1, s = n2.length - 1 - i2; // s表示res应该从右往左是第几位
            while (i1 >= 0) {
                int v = n1[i1] * n2[i2]; // 对应位的乘积
                int jj = (res[index - s] + v + j) / 10; // 保存进位
                res[index - s] = (res[index - s] + v + j) % 10; // 更新res的对应位置
                // System.out.println(jj + ":" + res[index - s]);
                j = jj;
                s++;
                i1--;
            }
            if (j != 0)
                res[index - s] = j;
            j = 0;
            i2--;
        }
        boolean tag = true;
        StringBuilder sb = new StringBuilder();
        for (int num : res) {
            if(num != 0 || !tag) {
                tag = false;
                sb.append(num);    
            }
        }
        return sb.toString();
    }
}

结果:

结论:

模拟乘法,你乘法怎么计算的,代码就怎么写。只不过一些细节地方值的注意 

 

猜你喜欢

转载自blog.csdn.net/smart_ferry/article/details/88797716
今日推荐