题目描述
- 不能直接把字符串转换成整数(会溢出)
- 面试被问过,今天刷面经又刷到。。那就索性水一篇文吧!
- 更新:原题就是 leetcode 415
思路 & 代码
- 只要理好字符串s、字符串t、答案字符串的对应位关系就好啦!
- 注意 carry 位的考虑:其中一个字符串已经结束时,也还需要考虑。
加法结束后,还要考虑最后一次 - 注意进行字符之间的加法的时候不要算乱了= =
- 时间复杂度 O(max(m, n)),取两字符串的最大长度
import java.util.*;
public class Solution {
public String solve (String s, String t) {
int sL = s.length();
int tL = t.length();
int maxL = Math.max(sL, tL);
char[] ans = new char[maxL];
int carry = 0;
for(int i = sL - 1, j = tL - 1; maxL > 0; i--, j--, maxL--){
int nowSum = 0;
if(i < 0){
nowSum = t.charAt(j) - '0' + carry;
}
else if(j < 0){
nowSum = s.charAt(i) - '0' + carry;
}
else{
nowSum = s.charAt(i) + t.charAt(j) - '0' - '0' + carry;
}
carry = nowSum / 10;
nowSum %= 10;
ans[maxL - 1] = (char)(nowSum + '0');
}
String ansS = new String(ans);
if(carry == 1){
ansS = '1' + ansS;
}
return ansS;
}
}
更新版
- 刷到评论区大佬的做法,很nice
- while 循环写得很巧妙。
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int carry = 0;
int i = num1.length() - 1, j = num2.length() - 1;
while(i >= 0 || j >= 0 || carry != 0) {
if(i >= 0) {
carry += num1.charAt(i--) - '0';
}
if(j >= 0) {
carry += num2.charAt(j--) - '0';
}
sb.append(carry % 10);
carry /= 10;
}
return sb.reverse().toString();
}
}