日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode: Multiply Strings

發(fā)布時間:2024/9/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode: Multiply Strings 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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.

大整數(shù)的字符串乘法,我本來對字符串表示的大整數(shù)就不是太熟悉,至于溢出該怎么處理也是不大清楚,所以參考了別人的做法,然后自己憑著印象重做了一次

    • 直接乘會溢出,所以每次都要兩個single digit相乘,最大81,不會溢出。
    • 比如385 * 97, 就是個位=5 * 7,十位=8 * 7 +?5 * 9 ,百位=3 * 7 + 8 * 9 …
      可以每一位用一個Int表示,存在一個int[]里面。
    • 這個數(shù)組最大長度是num1.len + num2.len,比如99 * 99,最大不會超過10000,所以4位就夠了。
    • 這種個位在后面的,不好做(10的0次方,可惜對應位的數(shù)組index不是0而是n-1),
      所以干脆先把string reverse了代碼就清晰好多。
    • 最后結(jié)果前面的0要清掉。

這里面的方法比較巧妙,也比較典型,需要掌握。大整數(shù)的字符串乘法,不能直接乘,每次都要兩個single digit相乘

再注意一下Corner Case, 31行,為什么要這么大費周折,因為如果input是“0”, “0”, 結(jié)果也是“0”,而不是“”,28-29行只是為了刪結(jié)果前面的0,而不是刪成空String,如果結(jié)果是0,還得保留一個0

1 public class Solution { 2 public String multiply(String num1, String num2) { 3 String st1 = (new StringBuffer(num1)).reverse().toString(); 4 String st2 = (new StringBuffer(num2)).reverse().toString(); 5 int[] result = new int[st1.length() + st2.length()]; 6 for (int i=0; i<st1.length(); i++) { 7 int temp1 = (int)(st1.charAt(i) - '0'); 8 for (int j=0; j<st2.length(); j++) { 9 int temp2 = (int)(st2.charAt(j) - '0'); 10 result[i+j] += temp1 * temp2; 11 } 12 } 13 14 StringBuffer res = new StringBuffer(); 15 for (int k=0; k<result.length; k++) { 16 int digit = (int)(result[k] % 10); 17 int carry = (int)(result[k] / 10); 18 res.insert(0, digit); 19 if (k < result.length-1) { 20 result[k+1] += carry; 21 } 22 } 23 24 while (res.length()>1 && res.charAt(0) == '0') { 25 res.deleteCharAt(0); 26 } 27 return res.toString(); 28 } 29 }

一開始我對溢出的理解不充分,并沒有充分理解 “直接乘會溢出”的含義,于是寫了個直接乘的code來測試:

1 public class Solution { 2 public String multiply(String num1, String num2) { 3 int n1 = Integer.parseInt(num1); 4 int n2 = Integer.parseInt(num2); 5 int num = n1 * n2; 6 return Integer.toString(num); 7 } 8 }

結(jié)果:java.lang.NumberFormatException: For input string: "6913259244"

Last executed input:?"6913259244", "71103343"

這個?"6913259244"明顯在Integer的有效范圍之外(-2147483648 to 2147483647),因此直接乘是不適用的。更別提如果兩個數(shù)相乘之后的積超過Integer_MAXVALUE呢。

而采取這種single digit相乘的方法,每次乘法最大都不會超過81,不會溢出

轉(zhuǎn)載于:https://www.cnblogs.com/EdwardLiu/p/3957599.html

總結(jié)

以上是生活随笔為你收集整理的Leetcode: Multiply Strings的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。