一开始的思路是采用小学时候算术时采用的竖式计算法,上下相加大于等于10就需要向前进一位,原来是打算用数学方法拼接每一位的和然后再转字符串,但是看上去行不通,于是采用了StringBuilder的方法。
StringBuilder的append方法是后插,但是使用public StringBuilder insert(int offset, char c)就可以达到前插的效果,前插时offset为0。
写到此处,已经可以完成num1与num2位数相同时候的操作。
public static String addStrings(String num1, String num2){
int i = num1.length()-1;
int j = num2.length()-1;
int flag = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 && j >= 0){
int x = num1.charAt(i) - '0';
int y = num2.charAt(j) - '0';
sb.insert(0,(x+y) % 10 + flag );
if (x + y >= 10){
flag = 1;
}
else{
flag = 0;
}
i--;
j--;
}
return sb.toString();
}
}
这是修改后的第二版,没有通过的测试用例是num1 = 584,num2 = 18,会得出5102的答案,问题出在了sb.insert(0,(x+y) % 10 + flag );这句上,如果x+y=9同时要进位的话,会insert10而不是0
public static String addStrings(String num1, String num2){
int i = num1.length()-1;
int j = num2.length()-1;
int flag = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0){
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
sb.insert(0,(x+y) % 10 + flag );
if (x + y >= 10){
flag = 1;
}
else{
flag = 0;
}
i --;
j --;
}
if (i == j & flag == 1){
sb.insert(0,1 );
}
return sb.toString();
}
修改后:
public static String addStrings(String num1, String num2){
int i = num1.length()-1;
int j = num2.length()-1;
int flag = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0){
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
sb.insert(0,(x + y + flag) % 10 );
if (x + y + flag >= 10){
flag = 1;
}
else{
flag = 0;
}
i --;
j --;
}
if (i == j & flag == 1){
sb.insert(0,1 );
}
return sb.toString();
}
但是这次又有了新的问题,没通过测试用例num1 = 99,num2 = 9,输出是08,问题出在了if (i == j & flag == 1)上,改成(flag == 1)就行了, 跟i是否和j相等没有任何关系,修改后就得到了一个通过啦
public static String addStrings(String num1, String num2){
int i = num1.length()-1;
int j = num2.length()-1;
int flag = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0){
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
sb.insert(0,(x + y + flag) % 10 );
if (x + y + flag >= 10){
flag = 1;
}
else{
flag = 0;
}
i --;
j --;
}
if (flag == 1){
sb.insert(0,1 );
}
return sb.toString();
}