LeetCode415 字符串相加 简单

LeetCode415 字符串相加 简单

题目

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

思路

因为是字符串表示的数字,且根据题目描述,不存在前导0和其他字符,因此这一题应当是把字符串当作数字来相加的。

因为前边做过一个链表数字相加的题,当时的思路和这个差不多,只不过这个是从后往前加。

上一个题,做的时候将相加和进位分离处理了,徒增了时间复杂度,这一次自然记住了需要维护一个进位变量

所以,思路就是同时从尾部向前遍历两个字符串,每一位相加,而且要加上进位变量,并保留个位,进位为相加后的十位(0或1)。直到某一个字符串遍历完毕(将另一个字符串剩余的部分加上去,而且不能忘记加进位变量)或者两者都遍历完毕,退出循环。
因为最后一位有可能有进位,比如90+10=100就是9+1=10,进了一位。
因此在退出循环后,要检查进位变量是否是0,如果不是就说明进位了,需要再加一个进位。

想要计算每一个字符的和,需要先转化成数字再相加,最简单的方法就是字符-‘0’,也就是直接使用编码差来得到其正确的数值

C++代码

#include <string>

using namespace std;

class Solution {
public:
    string addStrings(string num1, string num2) {
        // 维护一个进位变量
    	int upper = 0;
        string add_str = "";
    	// 加法,所以要从尾部字符开始计算
    	for (int index1 = num1.length()-1, index2 = num2.length()-1; index1 >= 0 || index2 >= 0; index1--,index2--)
    	{
            int t;
            // 检查是否有一个字符串已经结束了
            if (index1 < 0)
            {
	            // 字符串1已经结束了
                t = num2[index2] - '0' + upper;
            }
            else if (index2 < 0)
            {
                // 字符串2已经结束了
                t = num1[index1] - '0' + upper;
            }
    		else
            {
                // 逐位相加,还要加上进位变量
                t = num1[index1] - '0' + num2[index2] - '0' + upper;
            }
    		
            upper = t / 10;
            add_str = std::to_string(t % 10) + add_str;
    	}

        if (upper > 0) add_str = std::to_string(upper) + add_str;

        return add_str;
    }
};

官方解法

模拟

其思想和我的上述方法基本一致,只不过对于长短不一的情况,采取了补0的方法而不是添加判断:

我们定义两个指针 ii 和 jj 分别指向 \textit{num1}num1 和 \textit{num2}num2 的末尾,即最低位,同时定义一个变量 \textit{add}add 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 00,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。

代码
class Solution {
public:
    string addStrings(string num1, string num2) {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        string ans = "";
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int result = x + y + add;
            ans.push_back('0' + result % 10);
            add = result / 10;
            i -= 1;
            j -= 1;
        }
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-strings/solution/zi-fu-chuan-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

感想

题都是不白做的,每次和答案有一定的出入的时候,都会有印象并带入下次可能需要的算法中去,这也算是一个经验。
每日打卡完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值