题目如下:
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
直接上代码了,效率不怎么高,java算法优化自己还不太了解,有待学习,希望自己先渐渐训练出严谨的思维。
class Solution {
public String multiply(String num1, String num2) {
int a1[] = toIntArray(num1);
int a2[] = toIntArray(num2);
if(a1[0] == 0 || a2[0] == 0){
return "0";
}
int [][]medianValue = getMedainValue(a1, a2);
int []totalMedianValue = getTotalMedianValue(medianValue, a1, a2);
String result = getResult(totalMedianValue);
return result;
}
//将字符串转换为整型
public static int[] toIntArray(String s){
char []temp = s.toCharArray();
int []a = new int[s.length()];
for(int i = 0;i < s.length();i++){
a[i] = temp[i]-'0';
}
return a;
}
//用二位数组存放中间乘积值
public int[][] getMedainValue(int a1[],int a2[]){
int [][]medianValuetemp = new int[a1.length][a2.length+1];
for(int i = 0;i < a1.length;i++){
int esec = 0;
int bit = 0;
for(int j = a2.length -1;j >= 0;j--){
int temp = a1[i]*a2[j] + bit;
if(temp != 0){
bit = temp/10;
}else{
bit = 0;
}
medianValuetemp[i][esec] = temp % 10;
esec++;
}
if(bit > 0){
medianValuetemp[i][esec]=bit;
}
}
return medianValuetemp;
}
//对乘积中间值作求和
public int[] getTotalMedianValue(int[][] medianValue,int a1[],int a2[] ){
int []total = new int[a1.length+a2.length];
int location = 0;
for(int i = a1.length-1; i >= 0; i--){
int bit = 0;
int flag = location;
for(int j= 0;j < a2.length+1;j++){
int temp = medianValue[i][j]+total[flag] + bit;
bit = temp /10;
System.out.println(flag);
total[flag] = temp % 10;
flag++;
}
location++;
}
return total;
}
//将求得的结果做适当处理转换为字符串
public String getResult(int []medianValue){
String result = "";
if(medianValue[medianValue.length - 1] == 0){
for(int i = medianValue.length - 2;i >= 0;i--){
result = result + medianValue[i];
}
}else{
for(int i = medianValue.length - 1;i >= 0;i--){
result = result + medianValue[i];
}
}
return result;
}
}
有点菜,不知道是不是跟自己封装有关系,继续加油!