本文主要是介绍【算法详解】力扣415.字符串相加,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目描述
力扣链接:力扣415.字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
二、思路解析
这里题目不允许使用字符串转整数的函数,那么还有一个方法,那就是对字符串的每一个字符都减去'0'
,就可以得到对应的数字。
在很多编程语言中,字符和数字之间存在ASCII码
(或Unicode码)的关系。ASCII码是一种将字符映射到数字的编码方式。在ASCII码中,数字字符'0'
到'9'
的编码是连续的,依次为48
到 57
。因此,当你从字符 ‘0’ 中减去 ‘0’ 时,实际上是将字符的ASCII码值减去 ‘0’ 的ASCII码值,得到的结果就是字符所表示的数字。
举例来说:
- ‘0’ 的ASCII码是 48,所以 ‘0’ - ‘0’ 就是 48 - 48,结果是 0。
- ‘1’ 的ASCII码是 49,所以 ‘1’ - ‘0’ 就是 49 - 48,结果是 1。
- ‘2’ 的ASCII码是 50,所以 ‘2’ - ‘0’ 就是 50 - 48,结果是 2。
- 以此类推,直到 ‘9’ 的ASCII码是 57,所以 ‘9’ - ‘0’ 就是 57 - 48,结果是 9。
三、C++题解
根据以上结论,不难写出代码:
class Solution {
public:string addStrings(string num1, string num2) {int m = num1.size(), n = num2.size();int i = m - 1, j = n - 1, carry = 0; // carry代表进位string result;while (i >= 0 || j >= 0 || carry != 0) {int x = i >= 0 ? num1[i] - '0' : 0;int y = j >= 0 ? num2[j] - '0' : 0;int sum = x + y + carry;carry = sum / 10;result.push_back('0' + sum % 10);--i;--j;}// 因为是倒着push_back的,所以要反过来reverse(result.begin(), result.end());return result;}
};
这篇关于【算法详解】力扣415.字符串相加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!