【算法详解】力扣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;
    }
};
相关推荐
梭七y16 分钟前
【力扣hot100题】(033)合并K个升序链表
算法·leetcode·链表
郭涤生17 分钟前
Chapter 5: The Standard Library (C++20)_《C++20Get the details》_notes
开发语言·c++·笔记·c++20
月亮被咬碎成星星21 分钟前
LeetCode[383]赎金信
算法·leetcode
叶孤程33 分钟前
Qt图形化界面为何总被“冷落“?
开发语言·c++·qt
无难事者若执1 小时前
新手村:逻辑回归-理解03:逻辑回归中的最大似然函数
算法·机器学习·逻辑回归
写代码写到手抽筋1 小时前
C++多线程的性能优化
java·c++·性能优化
二进制人工智能1 小时前
【QT5 网络编程示例】UDP 通信
c++·qt
Maple_land1 小时前
# C++初阶——内存管理
c++
IT从业者张某某1 小时前
机器学习-04-分类算法-03KNN算法案例
算法·机器学习·分类
予安灵1 小时前
第十二届蓝桥杯省赛软件类(c&c++组)
c语言·c++·蓝桥杯