leetcode415 字符串相加

415. 字符串相加

已解答

简单

相关标签

相关企业

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示:

  • 1 <= num1.length, num2.length <= 104
  • num1 和num2 都只包含数字 0-9
  • num1 和num2 都不包含任何前导零
class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        # 从字符串的末尾开始逐位相加
        i, j = len(num1) - 1, len(num2) - 1
        carry = 0  # 记录进位
        result = []

        # 循环直到所有位都处理完,且没有进位
        while i >= 0 or j >= 0 or carry:
            # 取当前位的数字,如果越界则取0
            n1 = int(num1[i]) if i >= 0 else 0
            n2 = int(num2[j]) if j >= 0 else 0
            
            # 计算当前位的和,加上进位
            total = n1 + n2 + carry
            result.append(str(total % 10))  # 取当前位的数字
            carry = total // 10  # 更新进位

            # 移动到前一位
            i -= 1
            j -= 1

        # 结果数组是反向的,需要反转再拼接成字符串
        return ''.join(result[::-1])
class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        res = ""  # 存储结果的字符串
        i, j, carry = len(num1) - 1, len(num2) - 1, 0  # 指针 i, j 分别指向 num1 和 num2 的末尾,carry 为进位

        # 循环直到处理完所有位
        while i >= 0 or j >= 0:
            # 获取 num1 和 num2 当前位的数字,如果指针越界则取 0
            n1 = int(num1[i]) if i >= 0 else 0
            n2 = int(num2[j]) if j >= 0 else 0
            
            # 计算当前位的总和(包括进位)
            tmp = n1 + n2 + carry
            carry = tmp // 10  # 更新进位,取 tmp 的十位
            res = str(tmp % 10) + res  # 当前位的值添加到结果最左侧

            # 移动到前一位
            i, j = i - 1, j - 1

        # 如果最后还有进位,添加到结果最左侧
        return "1" + res if carry else res
class Solution {
    // 定义一个方法来实现字符串形式的大数相加
    public String addStrings(String num1, String num2) {
        // 创建一个StringBuilder用于存储结果,因为StringBuilder可变且支持反向操作
        StringBuilder res = new StringBuilder("");
        
        // i和j分别指向num1和num2的最后一个字符,用于从最低位开始逐位相加
        int i = num1.length() - 1, j = num2.length() - 1;
        
        // carry用于保存进位的值,初始为0
        int carry = 0;
        
        // 开始循环,当两个数字字符串中还有未处理的位或有进位时继续循环
        while(i >= 0 || j >= 0) {
            // 从num1和num2中分别提取当前位的值,超出边界则默认为0
            int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
            int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
            
            // 将两位数的和加上进位
            int tmp = n1 + n2 + carry;
            
            // 更新进位值,若两位数之和为10或以上,进位为1,否则为0
            carry = tmp / 10;
            
            // 将结果的个位部分添加到StringBuilder中
            res.append(tmp % 10);
            
            // 向前移动一位
            i--; 
            j--;
        }
        
        // 如果循环结束后仍有进位,则需要在结果中追加该进位
        if(carry == 1) {
            res.append(1);
        }
        
        // 结果需要反转,因为我们是从低位开始逐位相加
        return res.reverse().toString();
    }
}

详细注释说明:

  1. 方法定义public String addStrings(String num1, String num2):接收两个字符串参数,代表两个大整数。
  2. 变量定义
    • StringBuilder res:用来存储结果的字符串构建器,以便快速添加和反转字符串。
    • int iint j:分别表示字符串 num1num2 中当前位的位置,从最后一位(最低位)向前遍历。
    • int carry:表示进位,初始化为0。
  3. 循环逻辑
    • i >= 0j >= 0 时继续循环(即至少有一个字符串还未遍历完),且若仍有进位 carry,则继续循环。
  4. 位值提取与计算
    • n1n2 分别提取当前位值(若超出范围则默认为0)。
    • tmp:保存 n1n2carry 的和。
    • carry = tmp / 10:更新进位值,若 tmp 达到10或以上则产生进位。
    • res.append(tmp % 10):将当前位的个位数(结果位)添加到 res 中。
  5. 处理剩余进位:循环结束后,若有 carry == 1,需在 res 中追加进位。
  6. 反转结果:因结果是从低位开始构建,需反转后返回。

猜你喜欢

转载自blog.csdn.net/qq_73454087/article/details/143426484