題目
給定兩個字符串形式的非負(fù)整數(shù) num1 和num2 ,計算它們的和。
例如:"235" + "645" 結(jié)果為:"880","36" + "47" 結(jié)果為:"83"
解題
按照筆算加法的方式,相同數(shù)位對齊,依次進行加法,產(chǎn)生進位向前一位進位。如圖:

筆算加法
從字符串的最高的下標(biāo)對齊(字符串"abc",'a'的下標(biāo)為0,'c'的下標(biāo)是2,也就是兩個字符串右對齊),依次向前遍歷兩個字符串到下標(biāo)0的位置,如果其中一個字符串提前到下標(biāo)0,那么之后遍歷數(shù)位上都是0(相當(dāng)于位數(shù)少的字符串高位用0補齊)。
代碼
public String addStrings(String num1, String num2) {
if(null == num1){
return null;
}
if(null == num2){
return null;
}
int i = 0;
int carry = 0;
//StringBuilder模擬棧結(jié)構(gòu)把地位的結(jié)果放入棧底部,高位結(jié)果放入棧頂部
StringBuilder sb = new StringBuilder();
while(i < num1.length() || i < num2.length()){
//從高下標(biāo)開始,向0移動
int m = i < num1.length() ? (num1.charAt(num1.length() - 1 - i) - '0') : 0;
int n = i < num2.length() ? (num2.charAt(num2.length() - 1- i) - '0') : 0;
//產(chǎn)生的進位值,初始化0
int sum = m + n + carry;
//保存結(jié)果,更新進位值
sb.append(String.valueOf(sum % 10));
carry = sum / 10;
i++;
}
//最高位的進位單獨處理
if(carry > 0){
sb.append(String.valueOf(carry));
}
//翻轉(zhuǎn)StringBuilder獲取結(jié)果
return sb.reverse().toString();
}