問題:
Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2.
Note:
1、The length of both num1 and num2 is < 5100.
2、Both num1 and num2 contains only digits 0-9.
3、Both num1 and num2 does not contain any leading zero.
4、You must not use any built-in BigInteger library or convert the inputs to integer directly.
大意:
給出兩個字符串形式的非負數num1和num2,返回num1和num2之和。
注意:
1、num1和num2的長度都小于5100。
2、num1和num2都只包含數字0-9。
3、num1和num2都不包含處于首位的0。
4、你不能使用任何內置的大數庫或者直接將輸入轉化成整型。
思路:
題目不允許直接轉化成整型去計算,也就是要我們一位一位地將數字加起來實現一次加法了。從兩個字符串的最末尾開始去加,注意判斷是否要進位,一位位加到兩個字符串都遍歷完為止,為了速度這里要使用StringBuilder,如果直接用 + 去進行字符拼接就太慢了,注意我們每次對每位數進行加時還是用整型來計算,這還是允許的,不然也太麻煩了,代碼比較容易看懂。
代碼(Java):
public class Solution {
public String addStrings(String num1, String num2) {
if (num1.length() == 0) return num2;
else if (num2.length() == 0) return num1;
boolean hasUp = false;// 是否進位
int i = num1.length() - 1;
int j = num2.length() - 1;
StringBuilder sb = new StringBuilder();
while (i >=0 || j >= 0) {
int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int sum = n1 + n2 + (hasUp ? 1 : 0);
if (sum >= 10) {
sb.insert(0, Integer.toString(sum - 10));
hasUp = true;
} else {
sb.insert(0, Integer.toString(sum));
hasUp = false;
}
i--;
j--;
}
if (hasUp) sb.insert(0, "1");
return sb.toString();
}
}
合集:https://github.com/Cloudox/LeetCode-Record