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
andnum2
consist of only digits.num1
andnum2
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;
}
}