思路:模拟。
注意到题中len(s),len(t)≤100000,若先转换为int,会超出整型范围。 考虑模拟手算过程。
复杂度:时间复杂度O(n), 空间复杂度O(n)
代码(JAVA实现)
public class Solution {
public String solve (String s, String t) {
int len1=s.length();
int len2=t.length();
if(len1==0) return t;
if(len2==0) return s;
int len=len1>len2?len1:len2;//len为len1和len2两者中较大者
char[] sum=new char[len+1];//逆序存放,从低位到高位(下标小的对应低位)
int carry=0;//进位
int num=0;//两个数当前位上的数字相加的和
int digit=0;//进位后当前位上的数字
int i=len1-1,j=len2-1;//i为字符串s的遍历指针,j为字符串t的遍历指针
int k=0;//字符数组sum的遍历指针
//将两个字符串右对齐计算
while(i>=0&&j>=0) {
num=(s.charAt(i)-'0')+(t.charAt(j)-'0')+carry;
digit=num%10;
carry=num/10;
sum[k++]=(char)(digit+48);
i--;
j--;
}
while(i>=0) {//字符串s还没遍历完
num=(s.charAt(i)-'0')+carry;
digit=num%10;
carry=num/10;
sum[k++]=(char)(digit+48);
i--;
}
while(j>=0) {//字符串t还没遍历完
num=(t.charAt(j)-'0')+carry;
digit=num%10;
carry=num/10;
sum[k++]=(char)(digit+48);
j--;
}
if(carry!=0) sum[k]=(char)(carry+48);//还有进位
else k--;//指向最后一个字符
String res="";
while(k>=0)res+=sum[k--];//从高位到低位的输出
return res;
}
}