【手撕C++】string入门:字符串加法实战
目录前言题目字符串相加LeetCode 415思路模拟竖式加法完整代码1完善代码2代码逐行测试用例新手必看方法全解坑坑1判断条件写错导致数组越界坑2insert插入整数结果变成乱码总结前言很多人学完string的基本用法却不知道怎么用在题目里。这篇文章用一道经典题把string最容易踩坑的地方全部过一遍。题目字符串相加LeetCode 415给定两个字符串形式的非负整数num1和num2计算它们的和并同样以字符串形式返回。不能用内置库将字符串转为整数。输入num1 456, num2 77 输出533思路模拟竖式加法回忆一下小学怎么做加法4 5 6 7 7 ------- 5 3 3从个位开始从右往左逐位相加满10进1。用代码还原这个过程用两个下标end1、end2分别指向两个字符串的末尾每次取最后一位相加然后下标左移记录进位next下一轮加进去某一个字符串用完了就补0继续最后检查next是否为1特别注意完整代码1class 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; } };完善代码2class 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代码逐行拆解cppint end1 num1.size() - 1; int end2 num2.size() - 1;size()返回的是size_t是无符号类型所以这里用int接收防止0 - 1变成一个巨大的正数导致越界。cppwhile (end1 0 || end2 0)只要有一个字符串还没处理完就继续循环。用||而不是防止长度不一样时短的那个提前退出。只要记住while里写的是继续的条件只要有没遍历结束的string就向下落类似竖式加法cppint val1 end1 0 ? num1[end1--] - 0 : 0;如果下标还合法就取字符并转成数字5 - 0 5同时end1--左移一位否则补0。cppnext ret / 10; ret % 10;ret最大是9 9 1 19除以10得进位取余得当前位的值。next储存的是下一位的进位1 or 0ret是即将要头插到string s 的数值注意数值要‘a’转换成字符才能插入正确cpps.insert(s.begin(), 0 ret);因为是从个位往前加所计算结果得出的顺序数从右往左于是每次把新算出来的位插到字符串最前面这样就不用最后再反转了。cppif (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永远为trueend1越界之后还会继续访问读到的是随机内存里的值结果完全不可预测。记忆方法三目运算符在这里是还有没有位可以取所以判断的是下标不是值。字符不能错误的复制给int坑2insert插入整数结果变成乱码cpp// ❌ 错误写法 s.insert(s.begin(), 1); // 插入的是ASCII码为1的不可见字符 // ✅ 正确写法 s.insert(s.begin(), 1); // 插入的是字符1string的insert接受的是char类型。直接写1是整数会被当成ASCII码为1的控制字符插进去打印出来是乱码或者空白。加上单引号1才是字符。记忆方法凡是往string里插单个字符一定要加单引号。总结知识点要记住的三目运算符取字符判断的是下标是否合法insert插字符一定要加单引号字符转数字ch - 0数字转字符0 numsize()的坑用int接收别用size_t做减法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2546187.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!