字符串相加题目:
思路:
①取两个字符串末位字符 - '0’得到此位字符代表的实际值,相加并加上前一位的进位值
②用StringBuffer来存答案,最后记得反过来,因为append每次都加在当前StringBuffer的后面
代码:
class Solution {
public String addStrings(String num1, String num2) {
int len1 = num1.length() - 1;
int len2 = num2.length() - 1;
StringBuffer ans = new StringBuffer();
int add = 0;
while(len1 >= 0 || len2 >= 0 || add > 0){
int a = len1 >= 0 ? num1.charAt(len1--) - '0' : 0;
int b = len2 >= 0 ? num2.charAt(len2--) - '0' : 0;
int temp = a + b + add;
ans.append(temp%10);
add = temp/10;
}
return ans.reverse().toString();
}
}
时间复杂度: O(max(num1.length(),num2.length())
空间复杂度: O(1)
字符串相乘题目:
思路:
①结合大数相加的思想,按位乘后将结果相加
代码:
class Solution {
public String addStrings(String num1, String num2) {
int len1 = num1.length() - 1;
int len2 = num2.length() - 1;
StringBuffer ans = new StringBuffer();
int add = 0;
while(len1 >= 0 || len2 >= 0 || add > 0){
int a = len1 >= 0 ? num1.charAt(len1--) - '0' : 0;
int b = len2 >= 0 ? num2.charAt(len2--) - '0' : 0;
int temp = a + b + add;
ans.append(temp%10);
add = temp/10;
}
return ans.reverse().toString();
}
public String multiply(String num1, String num2) {
if(num1.equals("0") || num2.equals("0")){
return "0";
}
int len1 = num1.length() - 1;
int len2 = num2.length() - 1;
String ans = "0";
int size = 0;
for(int i = len1; i >= 0; i--){
int temp = 0;
int add1 = 0;
StringBuffer tempAns = new StringBuffer();
int j = len2;
while ( j >= 0 || add1 > 0){
int temp1 = ( i >= 0 ? num1.charAt(i) - '0' : 0) * (j >= 0 ? num2.charAt(j) - '0' : 0) + add1;
temp = temp1 % 10;
add1 = temp1 / 10;
tempAns.append(temp);
j--;
}
tempAns.reverse();
for(int k = 0; k < size; k++){
tempAns.append('0');
}
size++;
ans = addStrings(ans, tempAns.toString());
}
return ans;
}
}
时间复杂度: O(mn+n^2)
空间复杂度: O(1)
时间复杂度: O(mn+n^ 2),其中 m 和 nn 分别是 num1,num2的长度度。需要从右往左遍历num2的每一位,都需要和num1的每一位计算乘积,因此计算乘积的总次数是 mn。字符串相加操作共有 n 次,相加的字符串长度最长为 m+n,因此字符串相加的时间复杂度是 O(mn+n^2)
)。
空间复杂度:O(m+n),空间复杂度取决于存储中间状态的字符串,由于乘积的最大长度为 m+n,因此存储中间状态的字符串的长度不会超过 m+n。
版权声明:本文为weixin_40578464原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。