leetcode字符串乘法题目(大数乘法)
下面分别有我自己的解法和国外有个大佬的解法
package com.color.review01;
import java.util.Arrays;
public class MultiplyString {
public String multiply1(String num1, String num2) {
/**
* 自己的做法
*/
//把长度短的设置为num2,长的设置为num1
if(num1.length()<num2.length()){
String temp=num1;
num1=num2;
num2=temp;
}
//定义和初始化变量
char[]cse=new char[num1.length()*2];
Arrays.fill(cse,'0');
StringBuilder str=new StringBuilder().append(cse);
int carry=0;
int cat=str.length()-1;
//开始运算
for(int i=num2.length()-1;i>=0;i--){
int n2=num2.charAt(i)-'0';
for(int j=num1.length()-1;j>=0;j--){
int n1=num1.charAt(j)-'0';
int c=str.charAt(cat)-'0';
str.setCharAt(cat,(char)((n1*n2+c)%10+48));
carry=(n1*n2+c)/10;
int k=1;
while(cat-k>=0&&carry!=0){
int ctmp=str.charAt(cat-k)-'0';
str.setCharAt(cat-k,(char)((ctmp+carry)%10+48));
carry=(carry+ctmp)/10;
k++;
}
cat--;
}
cat+=num1.length()-1;
}
//计算完毕,整理结果,把前面的多余0去掉
String result=str.toString();
while(result.length()>1&&result.charAt(0)=='0')result=result.substring(1);
//返回结果值
return result;
}
/**
* 国外大佬的解法
* @param num1
* @param num2
* @return
*/
public String multiply2(String num1, String num2) {
int m = num1.length(), n = num2.length();
int[] pos = new int[m + n];
for(int i = m - 1; i >= 0; i--) {
for(int j = n - 1; j >= 0; j--) {
int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
int p1 = i + j, p2 = i + j + 1;
int sum = mul + pos[p2];
pos[p1] += sum / 10;
pos[p2] = (sum) % 10;
}
}
StringBuilder sb = new StringBuilder();
for(int p : pos) if(!(sb.length() == 0 && p == 0)) sb.append(p);
return sb.length() == 0 ? "0" : sb.toString();
}
public static void main(String[] args) {
MultiplyString ms=new MultiplyString();
String rs=ms.multiply2("999","999");
System.out.println("result:"+rs);
}
}
参考:国外大佬的解法