题目大意
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
- num1 和num2 的长度都小于 5100.
- num1 和num2 都只包含数字 0-9.
- num1 和num2 都不包含任何前导零。
- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
方法一:直接计算进位
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
if(num1.length()==0) return num2;
if(num2.length()==0) return num1;
char[] arr1 = new StringBuffer(num1).reverse().toString().toCharArray();
char[] arr2 = new StringBuffer(num2).reverse().toString().toCharArray();
int carry = 0;
int p = 0,q=0;
while(p<arr1.length && q<arr2.length) {
int temp = arr1[p++]-'0'+arr2[q++]+carry-'0';
if(temp>9) { //产生进位
carry = 1;
temp -= 10;
}else
carry = 0;
sb.append(temp);
}
while(p<arr1.length) {
int temp = arr1[p++]+carry-'0';
if(temp>9) { //产生进位
carry = 1;
temp -= 10;
}else
carry = 0;
sb.append(temp);
}
while(q<arr2.length) {
int temp = arr2[q++]+carry-'0';
if(temp>9) { //产生进位
carry = 1;
temp -= 10;
}else
carry = 0;
sb.append(temp);
}
if(carry!=0) sb.append(carry);
return sb.reverse().toString();
}
运行时间4ms。
方法二:改进版
在这个方法中,设置p和q两个指针,从后向前遍历。有个trick是,如果其中某个字符串先遍历完(指针指到了开头),直接将该位的数值设置为0。
public String addStrings(String num1, String num2) {
int p = num1.length()-1;
int q = num2.length()-1;
StringBuilder sb = new StringBuilder();
int carry = 0;
int n1=0,n2=0;
while(p>=0 || q>=0) {
n1 = p>=0?num1.charAt(p)-'0':0; //a trick
n2 = q>=0?num2.charAt(q)-'0':0;
int tmp = n1+n2+carry;
carry = tmp/10;
sb.append(tmp%10);
--p;--q;
}
if(carry!=0) sb.append(1);
return sb.reverse().toString();
}
运行时间4ms,击败85.80%。