题目描述
不能直接把字符串转换成整数(会溢出) 面试被问过,今天刷面经又刷到。。那就索性水一篇文吧! 更新:原题就是 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 ( ) ; }
}