zoukankan      html  css  js  c++  java
  • 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.

    Have you met this question in a real interview?
     
    Solutiion:
    a[i]*b[j] is the value of c[i+j]. So we have
     
    Iter a[i]
      iter b[j]
          c[i+j] = a[i]*b[j]+c[i+j]
          carry = c[i+j]/10;
          c[i+j] = c[i+j]%10;
         c[i+j+1] += carry.  //NOTE: because we are dealing with string, we need to manipulate the char directly, after adding carry to c[i+j+1], c[i+j+1] may be larger than 10. Therefore, we need to keep dealing with carry, until in some higher bit, the carry becomes 0!
     
     Newest Solution:
    Use int array, address all carry together afte calculation.
    public class Solution {
        public String multiply(String num1, String num2) {
            if (num1.isEmpty() || num2.isEmpty()) return "";
            if (num1.equals("0") || num2.equals("0")) return "0";
            
            int len1 = num1.length(), len2 = num2.length();
            int[] res = new int[len1+len2];
            int[] n1 = new int[len1];
            int[] n2 = new int[len2];
            
            for (int i=0;i<len1;i++){
                n1[i] = getValue(num1.charAt(len1-1-i));
            }
            
            for (int i=0;i<len2;i++){
                n2[i] = getValue(num2.charAt(len2-1-i));
            }
            
            
            for (int j=0;j<len2;j++)
                for (int i=0;i<len1;i++){
                    res[i+j] += n1[i]*n2[j];
                }
            
            StringBuilder builder = new StringBuilder();    
            for (int i=0;i<len1+len2-1;i++){
                res[i+1] += res[i] / 10;
                res[i] = res[i] % 10;
                builder.append(res[i]);
            }
            if (res[len1+len2-1]!=0)
                builder.append(res[len1+len2-1]);
            
            
            
            return builder.reverse().toString();
        }
        
        private static int getValue(char a){
            return (int) (a-'0');
        }
        
    }
     1 public class Solution {
     2     public String multiply(String num1, String num2) {
     3         if (num1.isEmpty() || num2.isEmpty()) return "";
     4         if (num1.equals("0") || num2.equals("0")) return "0";
     5         if (num1.equals("1")) return num2;
     6         if (num2.equals("1")) return num1;
     7 
     8 
     9         StringBuilder b1 = new StringBuilder(num1);
    10         StringBuilder b2 = new StringBuilder(num2);
    11         b1.reverse();
    12         b2.reverse();
    13         StringBuilder b3 = new StringBuilder();
    14 
    15         //perform multiplication bit by bit;
    16         for (int i=0;i<b1.length();i++){
    17             char c1 = b1.charAt(i);
    18             for (int j=0;j<b2.length();j++){
    19                 char c2 = b2.charAt(j);
    20                 int val = (c1-'0')*(c2-'0');
    21                 if (b3.length()>(i+j)) val += b3.charAt(i+j)-'0';
    22                 int carry = val/10;
    23                 val = val % 10;
    24                 //put val of current bit into string.
    25                 if (b3.length()>(i+j))
    26                     b3.replace(i+j,i+j+1,Integer.toString(val));
    27                 else b3.append((char)(val+'0'));
    28 
    29                 //put carry into (i+j+1) bit.
    30                 if (carry==0) continue;
    31                 int curBit = i+j+1;
    32                 while (carry!=0){ 
    33                     if (b3.length()>curBit){
    34                         val = (b3.charAt(curBit)-'0')+carry;
    35                         carry = val / 10;
    36                         val = val%10;
    37                         b3.replace(curBit,curBit+1,Integer.toString(val));
    38                         curBit++;
    39                     } else {
    40                         b3.append((char)(carry+'0'));
    41                         carry = 0;
    42                     }
    43                 }
    44             }
    45         }
    46 
    47         b3.reverse();
    48 
    49         return b3.toString(); 
    50     }
    51 }

     Solution2:

    Directly use char arry. It is faster than StringBuilder.

     1 public class Solution {
     2     public String multiply(String num1, String num2) {
     3         if (num1.isEmpty() || num2.isEmpty()) return "";
     4         if (num1.equals("0") || num2.equals("0")) return "0";
     5         if (num1.equals("1")) return num2;
     6         if (num2.equals("1")) return num1;
     7 
     8 
     9         StringBuilder temp = new StringBuilder(num1);
    10         temp.reverse();
    11         char[] b1 = temp.toString().toCharArray();
    12         temp = new StringBuilder(num2);
    13         temp.reverse();
    14         char[] b2 = temp.toString().toCharArray();
    15         char[] b3 = new char[b1.length+b2.length];
    16         Arrays.fill(b3,'0');
    17 
    18 
    19         //perform multiplication bit by bit;
    20         for (int i=0;i<b1.length;i++){
    21             char c1 = b1[i];
    22             for (int j=0;j<b2.length;j++){
    23                 char c2 = b2[j];
    24                 int val = (c1-'0')*(c2-'0') + (b3[i+j]-'0');
    25                 int carry = val/10;
    26                 val = val % 10;
    27                 //put val of current bit into string.
    28                 b3[i+j] = (char) (val+'0');
    29 
    30                 //put carry into (i+j+1) bit.
    31                 if (carry==0) continue;
    32                 int curBit = i+j+1;
    33                 while (carry!=0){ 
    34                     val = (b3[curBit]-'0')+carry;
    35                     carry = val / 10;
    36                     val = val%10;
    37                     b3[curBit] = (char)(val+'0'); 
    38                     curBit++;
    39                 }
    40             }
    41         }
    42        
    43         temp = new StringBuilder();
    44         int index = b3.length-1;
    45         for (int i=b3.length-1;i>=0;i--) 
    46             if (b3[i]!='0'){
    47                 index = i;
    48                 break;
    49             }
    50         for (int i=index;i>=0;i--) temp.append(b3[i]);
    51         
    52 
    53         return temp.toString(); 
    54     }
    55 }
     
     
  • 相关阅读:
    如何在百度网盘中批量添加好友,批量创建群组,导出群链接等
    批量对百度网盘好友及群组发文字消息及分享文件
    百度网盘禁止查看别人分享主页的资源收集解决办法
    C#调用windows API实现 smallpdf客户端程序进行批量压缩
    邓西百度网盘目录导出工具
    .net sqlite 内存溢出 问题的分析与解决。
    移动呼死你防护业务白名单批量导入工具
    如何拦截电话轰炸、短信轰炸
    以技术原理入手从根本上拦截屏蔽解决响一声电话呼死你炸你妹电话轰炸短信轰炸,远离电话短信骚扰
    邓西百度网盘批量分享工具
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4111915.html
Copyright © 2011-2022 走看看