LeetCode-415. Add String

Description

这里写图片描述

Note

这里写图片描述

Solution 1(C++)

class Solution {
public:
    string addStrings(string num1, string num2) {
        int sum = 0, i = num1.length() - 1, j = num2.length() - 1;
        string str;
        while (i >= 0 || j >= 0 || sum > 0) {
            if (i >= 0) sum += (num1[i--] - '0');
            if (j >= 0) sum += (num2[j--] - '0');
            str.insert(0, 1, (sum % 10) + '0');
            sum /= 10;
        }
        return str;
    }
};

Solution 2(C++)

class Solution {
public:
    string addStrings(string num1, string num2) {
        int i = num1.size() - 1;
        int j = num2.size() - 1;
        int carry = 0;
        string res = "";
        while(i>=0 || j>=0 || carry){
            long sum = 0;
            if(i >= 0){sum += (num1[i] - '0');i--;}
            if(j >= 0){sum += (num2[j] - '0');j--;}
            sum += carry; 
            carry = sum / 10;
            sum = sum % 10;
            res =  res + to_string(sum);
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

Solution 3(C++)

class Solution {
public:
    string addStrings(string num1, string num2) {
        long numa=StringToInt(num1), numb=StringToInt(num2);
        long sum= numa+ numb;
        cout<<numa<<"||"<<numb<<endl;
        return IntToString(sum);
    }

    long StringToInt(string &s){
        int len=s.size();
        long res=0;
        for(int i=0; i<len; i++){
            res+= (s[i]-48)* pow(10, len-i-1);
        }
        return res;
    }

    string IntToString(long &n){
        string res;
        if(n == 0) 
            res.push_back('0');
        while(n != 0){
            int temp= n % 10;
            n /= 10;
            res.push_back(temp+'0');
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

算法分析

经典的大数运算,解法三是我花了大半个下午,然后居然发现s[i]写成了s[1]的坑爹错误,还发现根本没对上别人的出题意图,完全自己在那里瞎做的惨痛教训。

一定一定要搞清楚题目的意思。不要在这里瞎写,所以解法三就放在这里,当作一个惨痛教训。解法三缺点有很多:1、运算范围受限于计算机性能与基本数据类型;2、大大增加了运算复杂度。

解法一与二本质无差别。经典的题目,一定以后在看到要多做几遍。

程序分析

首先,要说一个问题:函数reverse与reserve要区分开,前者可以参考:C++ reverse

然后就是:双引号”“ 与单引号‘’ 的区别,前者”0“,是一个string。后者’0’是一个字符char。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值