程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Multiply Strings -- LeetCode

Multiply Strings -- LeetCode

編輯:C++入門知識

 
這道題屬於數值操作的題目,其實更多地是考察乘法運算的本質。基本思路是和加法運算還是近似的,只是進位和結果長度復雜一些。我們仍然是從低位到高位對每一位進行計算,假設第一個數長度是n,第二個數長度是m,我們知道結果長度為m+n或者m+n-1(沒有進位的情況)。對於某一位i,要計算這個位上的數字,我們需要對所有能組合出這一位結果的位進行乘法,即第1位和第i-1位,第2位和第i-2位,... ,然後累加起來,最後我們取個位上的數值,然後剩下的作為進位放到下一輪循環中。這個算法兩層循環,每層循環次數是O(m+n),所以時間復雜度是O((m+n)^2)。算法中不需要額外空間,只需要維護一個進位變量即可,所以空間復雜度是O(1)。代碼如下:

public String multiply(String num1, String num2) {
    if(num1 == null || num2 == null || num1.length()==0 || num2.length()==0)
        return ;
    if(num1.charAt(0)=='0')
        return 0;
    if(num2.charAt(0)=='0')
        return 0;
    StringBuilder res = new StringBuilder();
    int num = 0;
    for(int i=num1.length()+num2.length();i>0;i--)
    {
        for(int j=Math.min(i-1,num1.length());j>0;j--)
        {
            if(i-j<=num2.length())
            {
                num += (int)(num1.charAt(j-1)-'0')*(int)(num2.charAt(i-1-j)-'0');
            }
        }
        if(i!=1 || num>0)
            res.append(num%10);
        num = num/10;
    }
    return res.reverse().toString();
}
實現中有兩個小細節,一個是循環中最後有一個if判斷,其實就是看最高一位是不是0(最高第二位不可能是0,除非兩個源字符串最高位帶有0),如果是就不需要加入字符串中了。另一個小問題是我們是由低位到高位放入結果串的,所以最後要進行一次reverse,因為是一個O(m+n)的操作,不會影響算法復雜度。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved