
思路:模拟人工加法。
一、算法流程:设定i,j两指针分别指向num1、num2尾部,模拟人工加法。
1.计算进位:计算carry = tmp / 10,代表当前位相加是否产生进位;
2.添加当前位:计算tmp = n1 + n2 + carry,并将当前位tmp % 10,添加至res头部;
3.索引溢出处理:当指针i或j走过数字首部后,给n1、n2赋值为0,相当于给num1、num2中长度较短的数字前面填0,以便后续计算;
4.当遍历完num1、num2后,跳出循环,并根据carry值决定是否在头部添加进位1,最终返回res即可。
二、复杂度分析:
1.时间复杂度:O(max(M,N)),其中M和N为两个数字的长度,按位遍历一遍数字(以较长的数字为准)。
2.空间复杂度:O(1),指针与变量需要使用常数大小的空间。
注意:
(1)字符串相加是对应位相加,因此i和j是从字符串最后一位做完运算后,i--,j--。
(2)字符串相乘是每位都要和对方的所有位相乘,因此是
for(int i = num1.length() - 1;i >= 0;i--){
int val1 =
for(int j = num2.length() - 1;j >= 0;j--){
int val2 =
int sum =
处理当前位和进位
}
}
附代码:
java
class Solution {
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 val1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int val2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int tmp = val1 + val2 + carry;
carry = tmp / 10;
res.append(tmp % 10);
i--;j--;
}
// 处理最高位相加后可能产生的进位
// 在加法运算中,当两个数字的最高位相加(加上之前的进位)后,如果结果大于等于10,就会产生一个进位
// 这个进位要在循环结束后单独处理
if(carry == 1){
res.append(1);
}
return res.reverse().toString();
}
}
ACM模式:
java
import java.util.Scanner;
class Solution {
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 val1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int val2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int tmp = val1 + val2 + carry;
carry = tmp / 10;
res.append(tmp % 10);
i--;
j--;
}
if (carry == 1) {
res.append(1);
}
return res.reverse().toString();
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取两个数字字符串
String num1 = scanner.next();
String num2 = scanner.next();
// 计算字符串相加结果
Solution solution = new Solution();
String result = solution.addStrings(num1, num2);
System.out.println(result);
scanner.close();
}
}