题目描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
(字符串长度不大于100000,保证字符串仅由'0'~'9'这10种字符组成)
示例1
输入:"1","99"
返回值:"100"
说明:1+99=100
题目分析
根据加法的运算过程可知,需要从字符串的低位开始依次进行加法运算,记录每一位的结果,最后拼接成字符串,如下图。
这里主要需要解决两个问题:
①用什么保存计算结果
②明确最后拼接的结果顺序
解题思路
方法1:从字符串尾部计算结果,依次拼接
直接使用StringBuilder来保存计算结果,若是直接使用append方法,则结果是正确结果的倒序(因为从低位开始计算,高位在低位后面),需要将最后的结果进行反转。
或者直接使用insert()方法,将后面高位的计算结果直接拼接在首位,则最后结果不需要反转。
方法2:使用栈来存储结果,再按顺序拼接
根据栈的“先入后出”的特点,可以用栈来保存每位的运算结果,最后使用StringBuilder按导出顺序拼接即可。
代码实现
方法1:从字符串尾部计算结果,依次拼接
public String solve (String s, String t) {
// write code here
// 表示字符串的字符位置,需要从低位开始计算
int s1 = s.length()-1;
int t1 = t.length()-1;
// 表示进位
int carry = 0;
StringBuilder sb = new StringBuilder();
while(s1>=0 || t1>=0 || carry > 0){
int n1 = s1 < 0 ? 0 : (s.charAt(s1--)-'0');
int n2 = t1 < 0 ? 0 : (t.charAt(t1--)-'0');
// 计算和
int sum = n1 + n2 + carry;
// 计算进位
carry = sum / 10;
sum = sum % 10;
// 从头部插入,保证结果的顺序
sb.insert(0,sum);
}
return sb.toString();时间复杂度:O(n+m),n,m为两个字符串的长度,因为需要遍历两个字符串,所以时间复杂度为O(n+m);
空间复杂度:O(n),n为两个字符串中长的那个字符串的长度,需要使用额外的n空间来保存计算结果。
方法2:使用栈来存储结果,再按顺序拼接
public String solve (String s, String t) {
// write code here
// 表示字符串的字符位置,需要从低位开始计算
int s1 = s.length()-1;
int t1 = t.length()-1;
// 表示进位
int carry = 0;
// 使用栈来保存结果,可以按顺序导出
Stack<Integer> stack = new Stack<>();
while(s1>=0 || t1>=0 || carry > 0){
int n1 = s1 < 0 ? 0 : (s.charAt(s1--)-'0');
int n2 = t1 < 0 ? 0 : (t.charAt(t1--)-'0');
// 计算和
int sum = n1 + n2 + carry;
// 计算进位
carry = sum / 10;
sum = sum % 10;
// 从头部插入,保证结果的顺序
stack.push(sum);
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()){
// 从栈中导出结果
sb.append(stack.pop());
}
return sb.toString();
}时间复杂度:O(n+m),n,m为两个字符串的长度,因为需要遍历两个字符串,所以时间复杂度为O(n+m);
空间复杂度:O(n),n为两个字符串中长的那个字符串的长度,需要使用额外的2*n空间来保存计算结果。

京公网安备 11010502036488号