題目
給定兩個(gè)字符串形式的非負(fù)整數(shù) num1 和num2 辖源,計(jì)算它們的和。
例如:"235" + "645" 結(jié)果為:"880"轴咱,"36" + "47" 結(jié)果為:"83"
解題
按照筆算加法的方式谤绳,相同數(shù)位對(duì)齊,依次進(jìn)行加法堰塌,產(chǎn)生進(jìn)位向前一位進(jìn)位。如圖:
從字符串的最高的下標(biāo)對(duì)齊(字符串"abc",'a'的下標(biāo)為0院喜,'c'的下標(biāo)是2,也就是兩個(gè)字符串右對(duì)齊)晕翠,依次向前遍歷兩個(gè)字符串到下標(biāo)0的位置喷舀,如果其中一個(gè)字符串提前到下標(biāo)0,那么之后遍歷數(shù)位上都是0(相當(dāng)于位數(shù)少的字符串高位用0補(bǔ)齊)淋肾。
代碼
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移動(dòng)
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)生的進(jìn)位值樊卓,初始化0
int sum = m + n + carry;
//保存結(jié)果拿愧,更新進(jìn)位值
sb.append(String.valueOf(sum % 10));
carry = sum / 10;
i++;
}
//最高位的進(jìn)位單獨(dú)處理
if(carry > 0){
sb.append(String.valueOf(carry));
}
//翻轉(zhuǎn)StringBuilder獲取結(jié)果
return sb.reverse().toString();
}