1.题目
https://leetcode.cn/problems/add-strings/
2.解法
思路
使用双指针从后往前遍历两个字符串,同时用一个变量 carry 来记录进位。每次计算两个字符的和,加上 carry ,然后将结果的个位数放入一个 StringBuilder 中,将结果的十位数作为新的 carry 。如果两个字符串的长度不同,可以用 0 补齐。最后,如果 carry 不为 0 ,还要将它加入 StringBuilder 中。最后,将 StringBuilder 反转并转换为字符串,就是最终的答案
这个解法的时间复杂度是 O(max(m,n)) ,其中 m 和 n 是两个字符串的长度。空间复杂度是 O(max(m,n)) ,因为需要一个额外的 StringBuilder 来存储结
我的思路是模拟竖式加法的过程。
我们从两个字符串的末尾开始,
- 每次取出一个字符,把它们转换为数字,然后相加。
- 如果有进位,我们把它加到下一位的和上。
- 我们把每一位的和的个位数加到结果中,
- 然后更新进位。
我们重复这个过程,
直到两个字符串都没有位数或进位为零。
最后,我们把结果反转,因为我们是从低位到高位计算的。
代码逻辑
我的思路的步骤:
- 初始化一个StringBuilder来存储结果,一个整数变量carry来表示进位,两个整数变量i和j来表示num1和num2的指针。
- 从两个字符串的末尾开始,即i = num1.length() - 1,j = num2.length() - 1。
- 当任一字符串还有位数或进位不为零时,执行以下操作:
- 初始化一个整数变量sum为carry的值。
- 如果num1还有位数,即i >= 0,则把num1.charAt(i)转换为数字并加到sum上,然后把i减一。
- 如果num2还有位数,即j >= 0,则把num2.charAt(j)转换为数字并加到sum上,然后把j减一。
- 把sum的个位数加到结果中,即sb.append(sum % 10)。
- 更新进位为sum的十位数,即carry = sum / 10。
- 反转结果并转换为字符串,即return sb.reverse().toString()。
具体实现
class Solution { public String addStrings(String num1, String num2) { StringBuilder sb = new StringBuilder(); int carry = 0; // 进位 int i = num1.length() - 1; // num1的指针 int j = num2.length() - 1; // num2的指针 while (i >= 0 || j >= 0 || carry > 0) { // 当任一字符串还有位数或进位不为零时 int sum = carry; // 当前位的和 if (i >= 0) { // 如果num1还有位数 sum += num1.charAt(i) - '0'; // 把字符转换为数字并加到sum上 i--; // 移动指针 } if (j >= 0) { // 如果num2还有位数 sum += num2.charAt(j) - '0'; // 把字符转换为数字并加到sum上 j--; // 移动指针 } sb.append(sum % 10); // 把sum的个位数加到结果中 carry = sum / 10; // 更新进位 } return sb.reverse().toString(); // 反转结果并转换为字符串 } }