难度 简单
这是一道简单的题,但是实现过程很容易繁琐。最开始考虑相加成int最后转换为String,然而发现越界了,还是要在String的基础上相加连接。
第一次:第一次实现的非常繁琐,既绕效率也不高。
执行用时 :15 ms, 在所有 Java 提交中击败了10.85%的用户
内存消耗 :39.7 MB, 在所有 Java 提交中击败了5.45%的用户
public String addStrings(String num1, String num2) {
if(num1.length() < num2.length()){
String temp = num1;
num1 = num2;
num2 = temp;
}
int d = num1.length() - num2.length();
int carryFlag = 0;
String result = "";
for(int i = num1.length() - 1; i >= 0; i--){
int a = num1.charAt(i);
int b = 48;
if(i-d >= 0 && i-d < num2.length()){
b = num2.charAt(i-d);
}
int sum = a+b+carryFlag-96;
if(sum >= 10){
carryFlag = 1;
result = (sum-10) + result;
}else{
carryFlag = 0;
result = sum + result;
}
}
if(carryFlag == 1){
result = "1" + result;
}
return result;
}
第二次:改善了算法,代码简洁了很多,但是效率提高不大
执行用时 :13 ms, 在所有 Java 提交中击败了13.27%的用户
内存消耗 :40 MB, 在所有 Java 提交中击败了5.45%的用户
public String addStrings(String num1, String num2) {
int i = num1.length()-1;
int j = num2.length()-1;
String result = "";
int carry = 0;
while(i >= 0 || j >= 0){
int a = i >= 0 ? num1.charAt(i)-'0' : 0;
int b = j >= 0 ? num2.charAt(j)-'0' : 0;
int sum = a + b + carry;
carry = sum/10 > 0 ? 1 : 0;
result = sum%10 + result;
i--;
j--;
}
if(carry == 1){
result = "1" + result;
}
return result;
}
第三次:改用StringBuilder代替String做连接处理。效率提高了不少,虽然不是理想状态但是就到这里吧,过度优化浪费时间不是一件好事。
执行用时 :3 ms, 在所有 Java 提交中击败了79.70%的用户
内存消耗 :40 MB, 在所有 Java 提交中击败了5.45%的用户
public String addStrings(String num1, String num2) {
int i = num1.length()-1;
int j = num2.length()-1;
StringBuilder result = new StringBuilder("");
int carry = 0;
while(i >= 0 || j >= 0){
int a = i >= 0 ? num1.charAt(i)-'0' : 0;
int b = j >= 0 ? num2.charAt(j)-'0' : 0;
int sum = a + b + carry;
carry = sum/10 > 0 ? 1 : 0;
result.append(sum%10);
i--;
j--;
}
if(carry == 1){
result.append(carry);
}
return result.reverse().toString();
}