【算法详解】力扣415.字符串相加

一、题目描述

力扣链接:力扣415.字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"

输出:"134"

二、思路解析

这里题目不允许使用字符串转整数的函数,那么还有一个方法,那就是对字符串的每一个字符都减去'0',就可以得到对应的数字。

在很多编程语言中,字符和数字之间存在ASCII码(或Unicode码)的关系。ASCII码是一种将字符映射到数字的编码方式。在ASCII码中,数字字符'0''9'的编码是连续的,依次为4857。因此,当你从字符 '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++题解

根据以上结论,不难写出代码:

cpp 复制代码
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;
    }
};
相关推荐
大阳12321 分钟前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
Swift社区43 分钟前
Swift 实战:实现一个简化版的 Twitter(LeetCode 355)
leetcode·swift·twitter
weixin_307779132 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
学行库小秘2 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
没落之殇2 小时前
基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
算法
秋难降2 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法
楚韵天工3 小时前
基于GIS的无人机模拟飞行控制系统设计与实现
深度学习·算法·深度优先·无人机·广度优先·迭代加深·图搜索算法
你也向往长安城吗4 小时前
推荐一个三维导航库:three-pathfinding-3d
javascript·算法
蒋星熠4 小时前
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
网络·c++·人工智能·深度学习·性能优化·系统架构
百度智能云4 小时前
VectorDB+FastGPT一站式构建:智能知识库与企业级对话系统实战
算法