LeetCode 415. 字符串相加

导读:本篇文章讲解 LeetCode 415. 字符串相加,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


1. 题目描述

题目链接:415. 字符串相加

在这里插入图片描述

2. 解题思路

字符串相加,又名大整数相加,或者大数运算。

就是和我们平时计算两个数的和一样,我们从两个字符串的最后一个数字开始进行相加,也就是 end - 1 的位置开始相加,并设置一个变量 carry 记录是否需要进位( carry 初始化为 0)。

这样一来,两个字符串相加的时候,每一位置的数字 = num1 对应位置的数字 + num2 对应位置的数字 + carry 进位变量。

若相加后,该位置的数字大于 9,则说明需要进位,这时我们设置进位变量 carry 为 1(两个数字相加,最多只能进位 1),并将该位置的数字减去 10 后的结果作为相加后该位置的数字即可。如此进行下去,直到两个字符串都遍历完毕即可。

特别注意,两个字符串相加结束后还需要判断进位变量是否为 1,若为 1,则需要头插一个字符 1 到最终的字符串中。

3. 代码实现

我们每得到一个位置(个位、十位、百位…)的结果就需要头插一个数字到最终的字符串中。

而头插的代价是比较大的,因为我们每次进行头插就需要将所有的数据都向后挪动一位,留出最前面的位置以供插入,这种算法的时间复杂度达到

O

(

N

)

O(N)

O(N)

所以,我们可以将得到的每一位数字都尾插到字符串后面,只需最后进行一次字符串反转即可。

代码示例

class Solution {
public:
    string addStrings(string num1, string num2) {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        int carry = 0; //进位符

        string retStr; //存储相加之后的结果

        // num1和num2都遍历完以后,才终止循环
        while (end1 >= 0 || end2 >= 0) {
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + carry;
            if (ret > 9) { //判断ret是否需要进位
                ret -= 10;
                carry = 1;
            }
            else {
                carry = 0;
            }
            retStr += ('0' + ret); //尾插
            --end1;
            --end2;
        }
        if (carry == 1) { //如果carry为1,说明还要进位
            retStr += '1';
        }

        reverse(retStr.begin(), retStr.end()); //反转字符串

        return retStr;
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80841.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!