[leetcode]43. Multiply Strings

自己设计数字字符串相乘的算法,不能用内置的方便方法。

有几条规则可以总结出来:

1.m位数*n位数,最多就是m+n位数

2.第i位和第j位相乘,的出来是第i+j位和i+j+1位(i\j都是从0开始)

这个题的关键是能想到用一个数组来装结果的每一位,每次两数相乘就叠加上

还有这个题有很多意外情况要考虑

public static String multiply(String num1, String num2) {
        /*
        用一个大小为m+n的数组存取结果的每一位
        两层遍历,每个元素分别相乘,每次相乘会得到一个两位数,两次相乘的结果总是重叠一位,也就是第一次相乘结果的十位是下次
        相乘结果的个位,这样每次相乘的时候除了两个数相乘的结果还要加上个位上原本就有的数,然后再分成个位和十位,存取。
         */
        int m = num1.length();
        int n = num2.length();
        if (m==0 || n==0)
            return "";
        int[] res = new int[m+n];
        int sum = 0;
        //这里要倒着乘
        for (int i = m-1; i >= 0; i--) {
            for (int j = n-1; j >=0; j--) {
                //计算十位和个位的位置
                int pten = i+j,pone = i+j+1;
                //两数相乘的结果
                sum = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
                //加上原本个位的结果
                sum+=res[pone];
                //分开存取
                //个位已经加了,所以不用+=
                res[pone] = sum %10;
                res[pten] += sum /10;
            }
        }
        //不能把数组组合成数字再转换,因为会超出long的范围
        //只能直接拼接字符串,而且要考虑到可能前几位都是0的情况,开头的0都不能要
        StringBuilder sb = new StringBuilder();
        for (int i = 0;i<res.length;i++) {
            if (sb.length()==0&&res[i]==0)
                continue;
            sb.append(res[i]);
        }
        String str = new String(sb);
        //等于0的情况要单独考虑
        return (str.length()==0)?"0":str;
    }

 

posted @ 2018-01-05 18:03  stAr_1  阅读(146)  评论(0编辑  收藏  举报