Tuesday, September 5, 2017

43. Multiply Strings


  1. 两数相乘,结果的长度不会大于两数长度和m + n,所以一开始我们开一个int[] res = new int[m + n]
  2. 接下来对num1和num2做一个双重循环从后向前遍历
    1. 当前的 digit1 = num1.charAt(i) - '0',  digit2 = num2.charAt(j) - '0'
    2. 这时我们可以更新当前res[i + j + 1]的这个位置为原来存在这一位置上的值再加上新的值digits 1 * digit2,简略一下就是 res[i + j + 1] += digits 1 * digit2 
    3. 接下来根据res[i + j + 1]的新值,我们可以更新高一位的res[i + j],  res[i + j] += res[i + j + 1] / 10,就是本来的值加上进位
    4. 最后我们再用res[i + j + 1] %= 10求出这一位置进位后剩下的digit
  3. 求出res数组之后我们可以建立一个StringBuilder sb,来从头遍历数组,求出最终结果
    1. 要注意的是当sb.length() == 0并且res[i] = 0时,这时候是开头的0值,需要跳过
    2. 假如遍历完毕以后sb.length()依然等于0, 我们返回"0"
二刷
还是完全不会哈哈

76.72 %
class Solution {
    public String multiply(String num1, String num2) {
        //     1 2 3 i
        //     4 5 6 j
        //       1 8 [i+j+1][i+j]
        //     1 2
        //   0 6
        //     1 5
        //   1 0
        // 0 5
        if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0) {
            return "";
        }
        int[] res = new int[num1.length() + num2.length()];
        for (int i = num1.length() - 1; i >= 0; i--) {
            for (int j = num2.length() - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int pos0 = i + j;
                int pos1 = i + j + 1;
                mul += res[pos1];
                res[pos0] += mul / 10;
                res[pos1] = mul % 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < res.length; i++) {
            if (sb.length() == 0 && res[i] == 0) continue;
            sb.append(res[i] + "");
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }
}


一刷
55.37 %
class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0) return "";
        int l1 = num1.length();
        int l2 = num2.length();
        int[] result = new int[l1 + l2];
        for (int i = l1 - 1; i >= 0; i--) {
            for (int j = l2 - 1; j >= 0; j--) {
                //int bit1 = Character.getNumericValue(num1.charAt(i));
                //int bit2 = Character.getNumericValue(num2.charAt(j));
                int bit1 = num1.charAt(i) - '0';
                int bit2 = num2.charAt(j) - '0';
                result[i + j + 1] += bit1 * bit2;
                result[i + j] += result[i + j + 1] / 10;
                result[i + j + 1] %= 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int k = 0; k < result.length; k++) {
            if (result[k] == 0 && sb.length() == 0) continue;
            sb.append(result[k]);
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }
}

No comments:

Post a Comment