43. Multiply Strings--两个很长的数字字符串相乘,不能使用大数乘法库或直接转换成整型计算

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/86516073

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.

Example 1:

Input: num1 = "2", num2 = "3"
Output: "6"

Example 2:

Input: num1 = "123", num2 = "456"
Output: "56088"

Note:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contain only digits 0-9.
  3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

方法2:是下面方法1的优化,算法逻辑都是一样的

    /**
     * 数组从后往前遍历
     * Runtime: 21 ms, faster than 96.28% of Java online submissions for Multiply Strings.
     *
     * @param num1
     * @param num2
     * @return
     */
    public String multiply(String num1, String num2) {
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        if ("1".equals(num1)) {
            return num2;
        }

        if ("1".equals(num2)) {
            return num1;
        }
        int num1Length = num1.length();
        int num2Length = num2.length();
        int sumLength = num1Length + num2Length;//规律,比如123*456,有三个积,每次左移一位,都处理成同长的数组,多出来的位当成0,然后相加。三位数*三位数则同长数组最长是6位
        int[] result = new int[sumLength];//存储结果
        int leftMulti, rightMulti, product, inc = 0, startIndex = 0, index = 0;
        for (int i = num1Length - 1; i >= 0; i--) {
            leftMulti = num1.charAt(i) - '0';
            for (int j = num2Length - 1; j >= 0; j--) {
                index = i + j + 1;
                rightMulti = num2.charAt(j) - '0';
                product = leftMulti * rightMulti + inc + result[index];//去除对product<10,>=10的判断,直接相加再/10,%10即可
                inc = product / 10;
                result[index] = product % 10;
                if (j == 0 && inc != 0) {
                    result[index - 1] = inc;//前面那一位
                    inc = 0;//进位已向左前进1位,别忘了置为0
                }
            }//for
        }//for
        if (inc != 0) {
            result[0] = inc;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.length; i++) {
            if (sb.length() != 0 || result[i] != 0) {//对取结果数值的代码做优化
                sb.append(result[i]);
            }
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }//multiply

方法1:数字字符转换成数字直接减去'0'即可!!

/**
 * <p>Title: </p>
 * <p>Description: </p>
 *
 * @Author
 * @CreateTime 2019/1/15 21:51
 */
public class Leetcode_43_MultiplyStrings {


    public static void main(String[] args) {
        Leetcode_43_MultiplyStrings leetcode_43_multiplyStrings = new Leetcode_43_MultiplyStrings();
//        System.out.println(leetcode_43_multiplyStrings.multiply("123", "2"));//246
//        System.out.println(leetcode_43_multiplyStrings.multiply("123", "12"));//1476
//        System.out.println(leetcode_43_multiplyStrings.multiply("123", "9"));//1107
//        System.out.println(leetcode_43_multiplyStrings.multiply("1234", "123"));//151782

//        System.out.println(leetcode_43_multiplyStrings.multiply("2", "3"));//6

//        System.out.println(leetcode_43_multiplyStrings.multiply("456", "123"));//56088
        System.out.println(leetcode_43_multiplyStrings.multiply("123", "456"));//56088
//        System.out.println(leetcode_43_multiplyStrings.multiply("9", "9"));//81

    }


    /**
     * 数组从后往前遍历
     * Runtime: 25 ms, faster than 67.41% of Java online submissions for Multiply Strings.
     *
     * @param num1
     * @param num2
     * @return
     */
    public String multiply(String num1, String num2) {
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        if ("1".equals(num1)) {
            return num2;
        }

        if ("1".equals(num2)) {
            return num1;
        }
        int num1Length = num1.length();
        int num2Length = num2.length();
        int sumLength = num1Length + num2Length;//规律,比如123*456,有三个积,每次左移一位,都处理成同长的数组,,多出来的位当成0,然后相加。三位数*三位数则同长数组最长是6位
        int[] result = new int[sumLength];//存储结果
        int leftMulti, rightMulti, product, inc = 0, startIndex = 0, index = 0;
        for (int i = num1Length - 1; i >= 0; i--) {
            rightMulti = num1.charAt(i) - '0';
            for (int j = num2Length - 1; j >= 0; j--) {
                index = i + j + 1;
                leftMulti = num2.charAt(j) - '0';
                product = leftMulti * rightMulti + inc;
                if (product < 10) {
                    result[index] = product + result[index];
                    inc = 0;
                    if (result[index] >= 10) {
                        inc = result[index] / 10;
                        result[index] = result[index] % 10;
                    }
                } else {
                    inc = product / 10;
                    result[index] = product % 10 + result[index];
                    if (result[index] >= 10) {
                        inc = inc + result[index] / 10;
                        result[index] = result[index] % 10;
                    }
                }
                if (j == 0 && inc != 0) {
                    result[index - 1] = inc;//前面那一位
                    inc = 0;//进位已向左前进1位,别忘了置为0
                }
            }//for
        }//for
        if (inc != 0) {
            result[0] = inc;
            startIndex = 0;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.length; i++) {
            if (result[i] != 0) {
                startIndex = i;
                break;
            }
        }
        for (int i = startIndex; i < sumLength; i++) {
            sb.append(result[i]);
        }
        return sb.toString();
    }//multiply


    /**
     * 长的数值、短的数值在上面或下面都无所谓
     * Runtime: 45 ms
     *
     * @param num1
     * @param num2
     * @return
     */
    public String multiply3(String num1, String num2) {
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        if ("1".equals(num1)) {
            return num2;
        }

        if ("1".equals(num2)) {
            return num1;
        }
        int num1Length = num1.length();
        int num2Length = num2.length();
        int sumLength = num1Length + num2Length;//规律,比如123*456,有三个积,每次左移一位,都处理成同长的数组,,多出来的位当成0,然后相加。三位数*三位数则同长数组最长是6位
        int[] arr1 = new int[sumLength];//存储结果
        int leftMulti, rightMulti, product, inc = 0, startIndex = 0, index = 0;
        for (int j = 0; j < num2Length; j++) {
            rightMulti = Integer.parseInt(num2.charAt(num2Length - j - 1) + "");//从后往前取
            for (int i = 0; i < num1Length; i++) {
                index = sumLength - i - j - 1;
                leftMulti = Integer.parseInt(num1.charAt(num1Length - i - 1) + "");//从后往前取
                product = leftMulti * rightMulti + inc;
                if (product < 10) {
                    arr1[index] = product + arr1[index];
                    inc = 0;
                    if (arr1[index] >= 10) {
                        inc = arr1[index] / 10;
                        arr1[index] = arr1[index] % 10;
                    }
                } else {
                    inc = product / 10;
                    arr1[index] = product % 10 + arr1[index];
                    if (arr1[index] >= 10) {
                        inc = inc + arr1[index] / 10;
                        arr1[index] = arr1[index] % 10;
                    }
                }
                if (i == num1Length - 1 && inc != 0) {
                    arr1[index - 1] = inc;//前面那一位
                    inc = 0;//进位已向左前进1位,别忘了置为0
                }
            }//for
        }//for
        if (inc != 0) {
            arr1[0] = inc;
            startIndex = 0;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != 0) {
                startIndex = i;
                break;
            }
        }
        for (int i = startIndex; i < sumLength; i++) {
            sb.append(arr1[i]);
        }
        return sb.toString();
    }//multiply


    /**
     * 易于理解版,长的数值在上面,短的数值在下面
     * Runtime: 47 ms, faster than 17.69% of Java online submissions for Multiply Strings.
     *
     * @param num1
     * @param num2
     * @return
     */
    public String multiply2(String num1, String num2) {
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        if ("1".equals(num1)) {
            return num2;
        }

        if ("1".equals(num2)) {
            return num1;
        }
        int num1Length = num1.length();
        int num2Length = num2.length();
        int sumLength = num1Length + num2Length;
        int[] arr1 = new int[sumLength];
        int[] arr2 = new int[sumLength];
        String numsTop = num1Length > num2Length ? num1 : num2;
        String numsBottom = num1Length <= num2Length ? num1 : num2;
        int numsTopLength = numsTop.length();
        int numsBottomLength = numsBottom.length();
        int leftMulti, rightMulti, product, inc = 0, startIndex = sumLength - 1;
        for (int j = 0; j < numsBottomLength; j++) {
            rightMulti = Integer.parseInt(numsBottom.charAt(numsBottomLength - j - 1) + "");
            for (int i = 0; i < numsTopLength; i++) {
                leftMulti = Integer.parseInt(numsTop.charAt(numsTopLength - i - 1) + "");
                product = leftMulti * rightMulti + inc;
                int a = sumLength - i - j - 1;
                if (product < 10) {
                    arr1[sumLength - i - j - 1] = product + arr1[sumLength - i - j - 1];
                    inc = 0;
                    if (arr1[sumLength - i - j - 1] >= 10) {
                        inc = arr1[sumLength - i - j - 1] / 10;
                        arr1[sumLength - i - j - 1] = arr1[sumLength - i - j - 1] % 10;
                    }
                } else {
                    inc = product / 10;
                    arr1[sumLength - i - j - 1] = product % 10 + arr1[sumLength - i - j - 1];
                    if (arr1[sumLength - i - j - 1] >= 10) {
                        inc = inc + arr1[sumLength - i - j - 1] / 10;
                        arr1[sumLength - i - j - 1] = arr1[sumLength - i - j - 1] % 10;
                    }
                }
                if (i == numsTopLength - 1 && inc != 0) {
                    arr1[sumLength - i - j - 1 - 1] = inc;//前面那一位
                    inc = 0;//进位已向左前进1位,别忘了置为0
                }
//                9*9 = 81时会报错
//                startIndex = sumLength - i - j - 1;//结果数值的起始位置,首位为0时,startIndex=1,表示从arr1[1]开始是数值
            }//for

        }//for
        if (inc != 0) {
            arr1[0] = inc;
            startIndex = 0;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != 0) {
                startIndex = i;
                break;
            }
        }
        for (int i = startIndex; i < sumLength; i++) {
            sb.append(arr1[i]);
        }
        return sb.toString();
    }//multiply

}


 

end

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/86516073
今日推荐