LeetCode-415. Add Strings [C++][Java]

LeetCode-415. Add Stringshttps://leetcode.com/problems/add-strings/

题目描述

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

You must solve the problem without using any built-in library for handling large integers (such as BigInteger). You must also not convert the inputs to integers directly.

Example 1:

Input: num1 = "11", num2 = "123"
Output: "134"

Example 2:

Input: num1 = "456", num2 = "77"
Output: "533"

Example 3:

Input: num1 = "0", num2 = "0"
Output: "0"

Constraints:

  • 1 <= num1.length, num2.length <= 104
  • num1 and num2 consist of only digits.
  • num1 and num2 don't have any leading zeros except for the zero itself.

解题思路

【C++】

1. 反转转换

class Solution {
public:
    string addStrings(string num1, string num2) {
        string output("");
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());
        int len1 = num1.length(), len2 = num2.length();
        if (len1 < len2) {
            swap(num1, num2);
            swap(len1, len2);
        }
        int addBit = 0;
        for (int i = 0; i < len2; i++) {
            int cur_sum = (num1[i] - '0') + (num2[i] - '0') + addBit;
            output += to_string(cur_sum % 10);
            addBit = cur_sum < 10 ? 0 : 1;
        }
        for (int i = len2; i < len1; i++) {
            int cur_sum = (num1[i] - '0') + addBit;
            output += to_string(cur_sum % 10);
            addBit = cur_sum < 10 ? 0 : 1;
        }
        if (addBit > 0) {output += '1';}
        reverse(output.begin(), output.end());
        return output;
    }
};

2. 原地修改

class Solution {
public:
    string addStrings(string num1, string num2) {
        if (num1.length() < num2.length()) {return addStrings(num2, num1);}
        int l1 = num1.length(), l2 = num2.length();
        char carry = 0;
        for(int i = 1; i <= l1; i++) {
            if (i <= l2) {carry += num2[l2 - i] - '0';}
            if (num1[l1 - i] + carry > '9') {
                num1[l1 - i] = num1[l1 - i] + carry - 10;
                carry = 1;
            } else {
                num1[l1 - i] = num1[l1 - i] + carry;
                carry = 0;
            }
        }
        if (carry > 0)  {return "1" + num1;}
        else {return num1;}
    }
};

3. two pointer

class Solution {
public:
    string addStrings(string num1, string num2) {
        int carry = 0;
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        string res = "";
        while (i >= 0 || j >= 0 || carry != 0){
            int ival = i >= 0 ? num1[i] - '0' : 0;
            int jval = j >= 0 ? num2[j] - '0' : 0; 
            i--;
            j--;
            int sum = ival + jval + carry;
            res = to_string(sum % 10) + res;
            carry  = sum / 10;
        }
        return res;
    }
};

【Java】

1. 反转转换

class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder sb1 = new StringBuilder(num1);
        StringBuilder sb2 = new StringBuilder(num2);
        sb1.reverse();
        sb2.reverse();
        int carry = 0;
        StringBuilder res = new StringBuilder();
        int i = 0;
        for (i = 0; i < sb1.length() && i < sb2.length(); i++){
            int sum = (sb1.charAt(i) - '0') + (sb2.charAt(i) - '0') + carry;
            carry = sum / 10;
            res.append(sum % 10);
        }
        
        while (i < sb1.length()){
            int sum = sb1.charAt(i) - '0' + carry;
            carry = sum / 10;
            res.append(sum % 10);
            i++;
        }
        
        while (i < sb2.length()){
            int sum = sb2.charAt(i) - '0' + carry;
            carry = sum / 10;
            res.append(sum % 10);
            i++;
        }
        if (carry == 1) {res.append(1);}
        return res.reverse().toString();
    }
}

2. Two Pointer

class Solution {
    public String addStrings(String num1, String num2) {
        int carry = 0;
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        String res = "";
        while(i >= 0 || j >= 0 || carry != 0){
            int ival = i >= 0 ? num1.charAt(i) - '0' : 0;
            int jval = j >= 0 ? num2.charAt(j) - '0' : 0; 
            i--;
            j--;
            int sum = ival + jval + carry;
            res = (sum % 10) + res;
            carry  = sum / 10;
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贫道绝缘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值