字符串相加

122 阅读1分钟

题目

给定两个字符串形式的非负整数 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 都不包含任何前导零

解析

题目明确要求不能使用任何库,以及直接将输入的字符串要求转换为整数形式。 因此可以采用双指针的方式,从后往前遍历字符串的每一个字符,并将每一位字符转为数字两两相加,即可得到它们计算和的字符。

具体步骤如下:

  1. 声明 i, j 指针分别指向num1, num2的末尾
  2. 声明 curry 保存当前进位
  3. 声明 res 空串表示num1,num2表示计算和的字符串
  4. 从后往前遍历 num1, num2的每一个字符
    • i >= 0 或者 j >= 0, 一直循环遍历
    • 在每一轮遍历计算出num1num2的每一位和,并赋值给curry
    • curry % 10 取余数得到当前位数, 拼接到res
    • Math.floor(curry / 10) 得到进位值, 并更新 curry
    • 指针i,j 减一, 向前遍历每一个字符
    • i < 0 或者 j < 0, 说明num1num2已经遍历完成,终止循环
  5. 最后判断如果 curry > 0 说明存在进位值,需要加上curry

参考代码

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function(num1, num2) {
    // i 指向 num1 的 末尾,
    let i = num1.length -1 ;
    // j 指向 num2 的 末尾
    let j = num2.length - 1;
    // curry 表示当前进位
    let curry = 0;
    // res 存储 num1 和 num2 的 每一位相加之和的值
    let res = '';

    // 循环终止条件:i, j 不能越界
    while (i >= 0 || j >= 0 ) {
        const x = parseInt(num1[i] || 0);
        const y = parseInt(num2[j] || 0);
        curry = x + y + curry;
        const mod = curry % 10;
        res = mod + res;
        curry = Math.floor(curry / 10);
        // 遍历当前后,i, j 指针往前走
        i--;
        j--;
    }
    // 如果 curry > 0, 说明存在进位, 要加上curry;
    return curry ? curry + res : res;
};

原题链接

415. 字符串相加