Add Strings 字符串相加
问题描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式 。
1 < = n u m 1. l e n g t h , n u m 2. l e n g t h < = 1 0 4 n u m 1 和 n u m 2 都只包含数字 0 − 9 n u m 1 和 n u m 2 都不包含任何前导零 1 <= num1.length, num2.length <= 10^4\\ num1 和num2 都只包含数字 0-9\\ num1 和num2 都不包含任何前导零 1<=num1.length,num2.length<=104num1和num2都只包含数字0−9num1和num2都不包含任何前导零
分析
这是一个典型的大数处理。数位长度已经无法使用64位表示,并且长度最大 1 0 4 10^4 104,所以需要通过模拟处理。
与之前的链表相加类似,低位对齐,然后计算加和,注意进位。
代码
public String addStrings(String num1, String num2) {int len1= num1.length(),len2= num2.length();int p1= len1-1,p2 = len2-1,carry =0 ;char[] ans = new char[Math.max(len1,len2)];int idx = ans.length-1;while(p1>=0||p2>=0||carry>0){int a = carry;if(p1>=0){a+=num1.charAt(p1)-'0';p1--;}if(p2>=0){a+=num2.charAt(p2)-'0';p2--;}carry = a/10; if(idx<0){return 1+new String(ans);} ans[idx] = (char)(a%10+'0'); idx--;}String s = new String(ans);return s;}
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( N ) O(N) O(N)
Tag
Math
String