给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
代码思路:
如果不会先进的算法,总体来说乘法就只能老老实实的进行乘法,然后进行相加操作,没啥好说的,就是自己代码能力的锻炼。
public String multiply(String num1, String num2) {
//对于简单的结果可以快速的返回
if(num1.equals("0")||num2.equals("0")) {
return "0";
}
if(num1.equals("1")) {
return num2;
}
if(num2.equals("1")) {
return num1;
}
StringBuffer buf=new StringBuffer();
num1=buf.append(num1).reverse().toString();
buf.replace(0, num1.length(), num2);
num2=buf.reverse().toString();
int add=0;
int midmul=0;
int value=0;
int current=0;
char[] temp=new char[num1.length()+1];
char[] result=new char[num1.length()+num2.length()];
String[] str=new String[num2.length()] ;
for(int i=0;i<num2.length();i++) {
str[i]=new String();
}
//将第二个字符串的每一位乘以第一个字符串的每一位
for(int i=0;i<num2.length();i++) {
add=0;
midmul=0;
//计算第二个字符串的每一位对第一个字符串的相乘结果
for(int n=0;n<num1.length();n++) {
midmul=(num2.charAt(i)-'0')*(num1.charAt(n)-'0')+add;
add=midmul/10;
value=midmul-10*add;
temp[n]=(char) (value+'0');
}
//然后将字符串的结果放到str中
temp[num1.length()]=(char)(add+'0');
str[i]=String.valueOf(temp);
}
midmul=num1.length()+num2.length();
value=0;
add=0;
//然后对str中的相乘的结果按照乘法的原则依次相加
for(int i=0;i<midmul;i++) {
value=0;
//按照输出的结果的位数,将各个位置上的数字相加
for(int n=0;n<num2.length();n++) {
if(i-n<0) {
break;
}else if(i-n>num1.length()) {
continue;
}
value=value+str[n].charAt(i-n)-'0';
}
//将相加的结果和前一位的进位总和放到结果的对应位置上
value=value+add;
add=value/10;
result[i]=(char) (value-add*10+'0');
}
//将上述的结果进行倒置
buf.replace(0, num2.length(), String.valueOf(result));
String outcome=buf.reverse().toString();
//计算最前面的位置上是否有多余的的0
for(value=0;value<outcome.length();){
if(outcome.charAt(value)=='0'){
value++;
}else{
break;
}
}
//有零就进行字符串的裁剪
outcome=outcome.substring(value);
return outcome;
}
踩掉的小坑:需要对字符串的长度有明确的了解,两个数相乘,结果的最长长度是num1.length()+num2.length()
,而第二个字符串的每一位乘以第一个字符串的最长长度是num1.length()+1
。
自己的存储空间放的数据和意义是什么,什么时候进位,以为下一位的进位和当前位置的结果的计算都需要注意。
博主代码的结果如下:
代码分析:
- 时间复杂度
num1的长度是n,num2的长度是m
在乘法计算中需要的时间是nm,第二个的字符串的每一位乘以第一个字符串。
在加法的计算中一共有mn个数字,所以还要进行mn次加法。
最终的时间复杂度是O(mn)。 - 空间的复杂度
博主的代码最大的使用了mn+m+n+m+n的空间。所以大体上可以是O(mn)的空间复杂度。
总体代码写的一般,中间还进行了两次倒置。