• [leetcode] Multiply Strings


    Given two numbers represented as strings, return multiplication of the numbers as a string.

    Note: The numbers can be arbitrarily large and are non-negative.

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

    思路:大数乘法,模拟笔算过程即可。

    注意的细节:

    1. 前导0去掉;
    2. 结果为0;

    代码:

    import java.util.Arrays;
    
    public class Solution {
    	public String multiply(String num1, String num2) {
    		if (num1 == null || num2 == null || num1.length() == 0
    				|| num2.length() == 0)
    			return null;
    		int n1 = num1.length();
    		int n2 = num2.length();
    
    		char[] str1 = num1.toCharArray();
    		char[] str2 = num2.toCharArray();
    		char[] prod = new char[n1 + n2];
    
    		Arrays.fill(prod, '0');
    
    		int i, j;
    		for (i = 0; i < n1; i++)
    			for (j = 0; j < n2; j++) {
    				prod[i + j] = (char) ((prod[i + j] - '0')
    						+ (str1[n1 - 1 - i] - '0') * (str2[n2 - 1 - j] - '0') + '0');
    			}
    
    
    		int c = 0;
    		for (i = 0; i < n1 + n2; i++) {
    			prod[i] = (char) ((prod[i] - '0') + c + '0');
    			if (prod[i] - '0' + c > 9) {
    				c = (prod[i] - '0') / 10;
    				prod[i] = (char) ((prod[i] - '0') % 10 + '0');
    			} else
    				c = 0;
    		}
    
    
    		StringBuilder sb = new StringBuilder();
    
    		i = n1 + n2 - 1;
    		while (i >= 0 && prod[i] == '0')
    			i--;
    		if (i == -1) {
    			sb.append("0");
    			return sb.toString();
    		}
    
    		for (; i >= 0; i--) {
    			sb.append(prod[i]);
    		}
    
    		return sb.toString();
    	}
    
    	public static void main(String[] args) {
    		System.out.println(new Solution().multiply("123", "12345"));
    		System.out.println(new Solution().multiply("0", "123"));
    		
    	}
    }

    第二遍记录:

      prod用int数组更方便些

      prod[i+j] += ,加号不要忘记了,是多个乘积累加。

      注意字符串顺序与索引是反的。

    public class Solution {
        public String multiply(String num1, String num2) {
            if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0)
                return null;
            int n1 = num1.length();
            int n2 = num2.length();
            int[] prod = new int[n1 + n2];
    
            for (int i = 0; i < n1; i++) {
                for (int j = 0; j < n2; j++) {
                    prod[i + j] += (num1.charAt(n1 - 1 - i) - '0') * (num2.charAt(n2 - 1 - j) - '0');
                }
            }
    
            int c = 0;
            for (int i = 0; i < n1 + n2; i++) {
                int curVal = prod[i] + c;
                if (curVal > 9) {
                    c = curVal / 10;
                    prod[i] = curVal % 10;
                } else {
                    prod[i] = curVal;
                    c = 0;
                }
            }
            StringBuilder sb = new StringBuilder();
            int idx = n1 + n2 - 1;
            while (idx >= 0 && prod[idx] == 0)
                idx--;
            if (idx == -1) {
                sb.append(0);
                return sb.toString();
            }
    
            while (idx >= 0)
                sb.append(prod[idx--]);
    
            return sb.toString();
    
        }
    
    }

    参考:

    http://www.cnblogs.com/TenosDoIt/p/3735309.html

    http://leetcodenotes.wordpress.com/2013/10/20/leetcode-multiply-strings-%E5%A4%A7%E6%95%B4%E6%95%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%98%E6%B3%95/comment-page-1/#comment-122

  • 相关阅读:
    CSS3 animation 属性
    关于shortcut icon和icon代码的区别介绍
    用js判断一个复选框是否被选中
    今天开始,走不一样的路
    JavaScript 中的对象
    (已转)Linux基础第七章 线程
    (已转)C++知识图谱
    Linux基础 文件和目录
    (已转)Linux基础第六章 信号
    Linux第四章 进程
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3810752.html
Copyright © 2020-2023  润新知