字符串相加
-
题目:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。示例 1: 输入: num1 = "2", num2 = "3" 输出: "6"
-
思路:模拟双指针。我们定义两个指针 i 和 j 分别指向num1和 num2 的末尾,即最低位,同时定义一个变量 carry 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理。
-
代码:
public String addStrings(String num1, String num2) { StringBuilder res = new StringBuilder(""); int i = num1.length() - 1, j = num2.length() - 1, carry = 0; while(i >= 0 || j >= 0){ int n1 = i >= 0 ? num1.charAt(i) - '0' : 0; int n2 = j >= 0 ? num2.charAt(j) - '0' : 0; int tmp = n1 + n2 + carry; carry = tmp / 10; res.append(tmp % 10); i--; j--; } // 最后的进位不为零,单独处理 if(carry == 1) res.append(1); // 逆输出正确的和 return res.reverse().toString(); }
-
复杂度分析
时间复杂度 O(max(M,N))):其中 M,N 为数组数字长度,按位遍历一遍数字(以较长的数字为准);
空间复杂度 O(1):指针与变量使用常数大小空间。