目录
一、前言
二、字符串相加
三、共勉
一、前言
最近春招已经开始,看周围的同学都在投递一些大厂的实习,某为的手撕代码 --- 字符串相乘,某讯的手撕代码 --- 字符串相减等。
于是专门去 Leetcode 上搜索了一下,发现这类题目是面试常考的题目。只要我们熟练的 掌握四则运算,熟练的掌握字符串的处理,就可以迎刃而解啦!
常考算法面试题分为:字符串(大数)相加、字符串(大数)相乘、字符串(大数)相减。本次博客主要通过图例和双指针来讲解 ---- 字符串(大数)相加
二、字符串相加
链接:415. 字符串相加 - 力扣(LeetCode)
题目分析:
- 我们先假设给定的不是字符串形式的数字,而是正常的非负整数,则两数相加遵循正常的加法运算,个位数与个位数相加,十位数与十位数相加,如果该位计算结果>9,则向前进位。
- 既然我们对加法的运算非常熟悉,代码也非常好写,那我们现在的任务就是将字符串形式的数字转换为正常的数字进行算术运算。
- 那么我们应该怎样取字符串中的每一位数字呢?我们定义两个指针,分别指向两个字符串的尾,然后取出该位置的字符,并将其转换为整数形式参与运算,并将结果再次转换为字符串形式,依次进行计算。 (双指针算法)
上图中就是我们计算字符串相加的一个大概思路,但是这里需要注意几点情况:
- a:进位的情况;
- b:两个字符串长度不相等;
针对情况a:我们每次相加后要判断该值是否>9,如果>9,则要-10,前一位并+1。从而完成进位
针对情况b:我们对循环的结束条件进行控制,当两个指针均走到结束位置,循环才结束,仅仅一个走到头不算结束,并且先走到头的指针,其值一直为0。
整个过程的图例与解析:
- 对齐低位,即从两个字符串的末位开始从后往前计算;
- 计算每一位,当前位的和等于两个加数的当前位的数字之和再加上进位;
- 当前位的值等于当前位的和模10;
- 当前位产生的进位位等于当前位的和除以10并向下取整;
- 当两个数字的位数不一致,位数少的高位补0;
- 当计算完两个数字所有位后,进位位不为0的,即高位补1;
代码样例:
class Solution {
public:string addStrings(string num1, string num2) {// 计算两个字符串的 下标 长度int end1 = num1.size()-1 , end2 = num2.size()-1;// 进位换算符号int next = 0;// 最终字符串 string a;// 开始相加,直到两个字符串都加完为止 while(end1>=0 || end2>=0){int val1 = 0;if(end1>=0){// 将字符准换为数字val1 = num1[end1--] - '0';}int val2 = 0;if(end2>=0){val2 = num2[end2--] - '0';}int ret = val1 + val2 + next;// 计算进位next = ret/10;ret = ret%10;// 写入字符串a+=ret + '0';}if(next==1){a+="1";}reverse(a.begin(),a.end());return a;}
};
三、共勉
以下就是我对 力扣-415-字符串相加 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 字符串相乘 的理解,请持续关注我哦!!!