lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 来存储结

 

 

我的思路是模拟竖式加法的过程。

我们从两个字符串的末尾开始,

  • 每次取出一个字符,把它们转换为数字,然后相加。
  • 如果有进位,我们把它加到下一位的和上。
  • 我们把每一位的和的个位数加到结果中,
  • 然后更新进位。

我们重复这个过程,

直到两个字符串都没有位数或进位为零。

最后,我们把结果反转,因为我们是从低位到高位计算的。

 

代码逻辑

我的思路的步骤:

  1. 初始化一个StringBuilder来存储结果,一个整数变量carry来表示进位,两个整数变量i和j来表示num1和num2的指针。
  2. 从两个字符串的末尾开始,即i = num1.length() - 1,j = num2.length() - 1。
  3. 当任一字符串还有位数或进位不为零时,执行以下操作:
    • 初始化一个整数变量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。
  4. 反转结果并转换为字符串,即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(); // 反转结果并转换为字符串
    }
}

  

3.总结

posted on 2023-04-10 19:15  白露~  阅读(6)  评论(0编辑  收藏  举报