LeetCode 415. Add Strings

问题描述:

Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2.

Note:

  1. The length of both num1 and num2 is < 5100.
  2. Both num1 and num2 contains only digits 0-9.
  3. Both num1 and num2 does not contain any leading zero.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.
思路:

问题比较简单,string类型的加法,把num1和num2由后往前遍历,每个元素依次相加,用f记录是否进位,第一次提交超时,后来把进位判断 改为f = sum/10 ; sum %= 10;就通过了,课件if判断语句效率比较低

算法:

class Solution {
public:
string addStrings(string num1, string num2) {
	int s1len = num1.length()-1;
	int s2len = num2.length()-1;
	string res = "";

	int f =0;
	while (s1len>=0 || s2len>=0 || f ) {
		int sum = 0;
		if (s1len >= 0)
			sum += (num1[s1len--] - '0');
		if (s2len >= 0)
			sum += (num2[s2len--] - '0');
		sum += f;
		
		f = sum/10;
		sum %= 10;
		
		res = res + to_string(sum);
	}
	reverse(res.begin(), res.end());
	return res;
}
};


solution看到一个c++ 3ms 5lines的算法,其实核心思路是一样的,只是用了很多c++编程的tricks,一并贴上并附注释:

class Solution {
public:
    string addStrings(string num1, string num2) {
        //第一行调用自己,巧妙的确保了num1的长度大于num2
        if (num1.size() < num2.size()) return addStrings(num2, num1);
        int carry = 0, i = num1.size() - 1, j = num2.size() - 1;
	//按num1的长度遍历,这里把carry的计算放在的for循环里,计算量并没有减少,但是可以少一行代码
        for (; i >= 0 && (carry || j >= 0); i--, j--, carry /= 10) 
	//这一行有2个tricks
	//1、+= 赋值运算不仅会计算carry的值,同时也会把计算结果返回
	//2、+'0'把int转成了char
            num1[i] = (carry += num1[i] - '0' + (j >= 0 ? num2[j] - '0' : 0)) % 10 + '0';
	//最后一行判断是否有进位,有进位在返回值前+'1'
        return (carry ? "1" : "") + num1;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值