【算法详解】力扣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;
    }
};
相关推荐
~|Bernard|18 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师18 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo318 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC19 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
利刃大大20 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
C语言小火车21 小时前
【C++八股文】基础知识篇
c++·tcp/ip·const·智能指针·多线程同步·static关键字·c++内存模型
liulilittle21 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
眠りたいです21 小时前
基于脚手架微服务的视频点播系统-播放控制部分
c++·qt·ui·微服务·云原生·架构·播放器
Want59521 小时前
C/C++圣诞树①
c语言·开发语言·c++
老赵的博客1 天前
c++ 杂记
开发语言·c++