class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0 || num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        
        int length = num1.length() + num2.length();
        int[] multi = new int[length];
        Map<Integer, Integer> carry = new HashMap<>();
        int i = num1.length() - 1;

        for (; i >= 0; i--) {
            for (int j = num2.length() - 1; j >= 0; j--) {
                int current = (int)(num1.charAt(i) - '0') * (int)(num2.charAt(j) - '0') + carry.getOrDefault(i + j + 1, 0) + multi[i + j + 1];
                carry.put(i + j + 1, 0);
                multi[i + j + 1] = current % 10;
                carry.put(i + j, carry.getOrDefault(i + j, 0) + current / 10);
                if (i == 0 && j == 0 && carry.get(0) > 0) {
                    multi[0] = carry.get(0);
                }
            }
        }
        
        boolean flag = true;
        StringBuilder sb = new StringBuilder();
        for (i = 0; i < length; i++) {
            if (multi[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
                sb.append((char)(multi[i] + '0'));
            }
        }
        
        return sb.toString();
    }
}

 

1. Multiplication length are sum of two lengths.

2. Multiplied value should be ADDED to the position not REPLACE since there could be other places multiplied to.

3. Remember to clear the map since the position is not one time reach.

4. Check the first value as the value is not counted in multi array.

posted on 2017-08-22 14:29  keepshuatishuati  阅读(121)  评论(0编辑  收藏  举报