当前位置: 首页 > news >正文

【手撕C++】string入门:字符串加法实战

目录

前言

题目:字符串相加(LeetCode 415)

思路:模拟竖式加法

完整代码1:

完善代码2:

代码逐行

测试用例

新手必看:方法全解+坑

坑1:判断条件写错,导致数组越界

坑2:insert插入整数,结果变成乱码

总结



前言

很多人学完string的基本用法,却不知道怎么用在题目里。这篇文章用一道经典题,把string最容易踩坑的地方全部过一遍。


题目:字符串相加(LeetCode 415)

给定两个字符串形式的非负整数num1num2,计算它们的和并同样以字符串形式返回。不能用内置库将字符串转为整数。

输入:num1 = "456", num2 = "77" 输出:"533"

思路:模拟竖式加法

回忆一下小学怎么做加法:

4 5 6 + 7 7 ------- 5 3 3

个位开始,从右往左,逐位相加,满10进1。

用代码还原这个过程:

  • 用两个下标end1end2分别指向两个字符串的末尾
  • 每次取最后一位相加,然后下标左移
  • 记录进位next,下一轮加进去
  • 某一个字符串用完了,就补0继续
  • 最后检查next是否为1(特别注意)

完整代码1:

class Solution { public: string addStrings(string num1, string num2) { string s; int next = 0; int end1 = num1.size() - 1; int end2 = num2.size() - 1; while (end1 >= 0 || end2 >= 0) { int val1 = end1 >= 0 ? num1[end1--] - '0' : 0; int val2 = end2 >= 0 ? num2[end2--] - '0' : 0; int ret = val1 + val2 + next; next = ret / 10; ret %= 10; s.insert(s.begin(), '0' + ret); } if (next == 1) s.insert(s.begin(), '1'); return s; } };

完善代码2:

class Solution { public: string addStrings(string num1, string num2) { string s; int next = 0; int end1 = num1.size() - 1; int end2 = num2.size() - 1; while (end1 >= 0 || end2 >= 0 || next ==1) { int val1 = end1 >= 0 ? num1[end1--] - '0' : 0; int val2 = end2 >= 0 ? num2[end2--] - '0' : 0; int ret = val1 + val2 + next; next = ret / 10; ret %= 10; s.insert(s.begin(), '0' + ret); } return s; } };

while (end1 >= 0 || end2 >= 0 || next ==1) 其中知识while的条件不同,这让可以省掉最后的

if判断next == 1;


代码逐行拆解

cpp

int end1 = num1.size() - 1; int end2 = num2.size() - 1;

size()返回的是size_t,是无符号类型,所以这里用int接收,防止0 - 1变成一个巨大的正数导致越界。

cpp

while (end1 >= 0 || end2 >= 0)

只要有一个字符串还没处理完,就继续循环。用||而不是&&,防止长度不一样时短的那个提前退出。

只要记住while()里写的是继续的条件,只要有没遍历结束的string,就向下落,类似竖式加法

cpp

int val1 = end1 >= 0 ? num1[end1--] - '0' : 0;

如果下标还合法,就取字符并转成数字('5' - '0' = 5),同时end1--左移一位;否则补0。

cpp

next = ret / 10; ret %= 10;

ret最大是9 + 9 + 1 = 19,除以10得进位,取余得当前位的值。

next储存的是下一位的进位1 or 0;

ret是即将要头插到string s 的数值(注意:数值要+‘a’转换成字符才能插入正确

cpp

s.insert(s.begin(), '0' + ret);

因为是从个位往前加,所计算结果得出的顺序数从右往左,

于是每次把新算出来的位插到字符串最前面,这样就不用最后再反转了。

cpp

if (next == 1) s.insert(s.begin(), '1');

循环结束后如果还有进位,说明最高位进了1,手动加上。(最多进1,不会是2)

测试用例

新手必看:方法全解+坑

坑1:判断条件写错,导致数组越界

cpp

// ❌ 错误写法 int val1 = num1[end1] >= 0 ? num1[end1--] - '0' : 0; // ✅ 正确写法 int val1 = end1 >= 0 ? num1[end1--] - '0' : 0;

这里的条件应该判断下标end1是否还合法,而不是判断数组元素。

num1[end1]是一个char字符,它的ASCII值永远大于0,所以num1[end1] >= 0永远为true,end1越界之后还会继续访问,读到的是随机内存里的值,结果完全不可预测。

记忆方法:三目运算符在这里是"还有没有位可以取",所以判断的是下标,不是

字符不能错误的复制给int


坑2:insert插入整数,结果变成乱码

cpp

// ❌ 错误写法 s.insert(s.begin(), 1); // 插入的是ASCII码为1的不可见字符 // ✅ 正确写法 s.insert(s.begin(), '1'); // 插入的是字符'1'

stringinsert接受的是char类型。直接写1是整数,会被当成ASCII码为1的控制字符插进去,打印出来是乱码或者空白。

加上单引号'1'才是字符。

记忆方法:凡是往string里插单个字符,一定要加单引号



总结

知识点要记住的
三目运算符取字符判断的是下标是否合法
insert插字符一定要加单引号
字符转数字ch - '0'
数字转字符'0' + num
size()的坑int接收,别用size_t做减法
http://www.jsqmd.com/news/687053/

相关文章:

  • 别再死记硬背LabVIEW函数了!用官方Vision示例库,5分钟搞定图像采集与处理
  • 别再死记硬背公式了!手把手带你从物理图像理解PMSM的Clarke与Park变换
  • 别再只画图了!用Matlab Simulink+Simscape Multibody给你的SolidWorks装配体做个‘体检’(附完整联动教程)
  • D3KeyHelper终极指南:暗黑3玩家的5分钟自动化配置教程
  • 终极指南:HS2-HF_Patch汉化补丁轻松安装教程
  • 揭秘ComfyUI-Impact-Pack:解锁AI图像增强的终极武器
  • 幼教人必看|教育部中央电教馆幼儿园职业园长证,认准湖北行以学文教育! - 教育官方推荐官
  • OpenCore-Configurator:如何通过图形化界面解决黑苹果配置的三大核心难题
  • VisionPro找线工具实战:对比度与位置卡尺计分到底怎么选?一个案例讲透
  • JL杰理AC696N开发板常见问题:在Code::Blocks编译下载程序时,点击SDK中的download.bat 后,如何判断程序已成功下载到开发板?都已经提示下载成功,程序新加的打印内容怎么没有
  • 基于安卓的智能大棚环境监控系统毕设
  • 终极RDP Wrapper指南:免费解锁Windows远程桌面完整功能
  • 保姆级教程:在RV1109开发板上集成RGA与DRM,搞定图像缩放硬件加速(附完整C++封装类)
  • 湖北本州代理记账服务专业程度高吗,孝感工商财税服务费用多少 - 工业品牌热点
  • 用Python的Deepface库,5分钟搞定人脸情绪、年龄、性别分析(附完整代码)
  • 一站式解决:Visual C++运行库全版本智能安装方案
  • 【架构解密】如何用Audio Router重构Windows音频工作流
  • 联想刃7000K BIOS解锁完整指南:3步释放隐藏性能选项
  • 2026湖北本州代理记账服务靠谱吗,武汉工商财税服务公司推荐 - 工业推荐榜
  • 抖音下载工具终极指南:5分钟掌握免费直播保存完整方案
  • AI专著生成全攻略:4款AI工具大揭秘,快速完成20万字专著写作!
  • 超越常规分析:用CellOracle的in silico基因扰动模拟,预测细胞命运走向
  • Windows 11 LTSC系统安装微软商店的完整指南:简单三步快速恢复应用商店功能
  • MZmine 3:免费开源质谱数据分析的完整解决方案
  • 如何在5分钟内将你的浏览器性能提升30%:Thorium完全配置指南
  • Koodo Reader:当AI遇见电子书,你的个人阅读助手来了![特殊字符]
  • 服务不错的球磨机工厂如何选?鑫鸿祥机械的客户给出了答案 - 新闻快传
  • 如何快速配置多平台网盘直链下载工具:新手完整教程
  • LFM2.5-1.2B-Thinking-GGUF效果深度评测:代码生成、逻辑推理与数学能力横向对比
  • 敲重点!2026金相显微镜8大热门一次看懂!