各位老铁早上好,今天来分享一下我前两天做的leetcode的题目,我个人觉得这两道题目挺经典的,所以打算写这篇博客进行总结,希望各位老铁看完我这篇博客能有所收获。
字符串相加
题目链接
题目要求:你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
该题目要求意味着我们不能使用标准库进行大整数的运算,也不能直接把字符串直接转化为整数进行计算。
那么我们该如何解这道题呢?首先我们在小学都学过加法竖式的运算,下面我就结合该题目画一下加法运算的竖式运算图和分享一下该题目解题思路。
解题思路:
下面我们就来写一下代码吧(笔者直接就在oj上写代码了)
1.变量的定义:
//定义end1和end2分别指向字符串num1和num2的末尾
int end1=num1.size()-1, end2=num2.size()-1;
int carry=0;
//存放数字相加的结果
int sum=0;
//存放相加后转成的字符串
string addret;
//用于存放字符串转化为数字
int val1=0,val2=0;
2.字符串转化为数字:
//只要有一个位数>=0循环就不能停止
while(end1>=0||end2>=0)
{
//对字符串num1进行转化成数字
if(end1>=0) int val1=num1[end1--]-'0';
else
val1=0;//对位数小于另一个字符串的位数进行处理
//对字符串num2进行转化成数字
if(end2>=0) int val2=num2[end2--]-'0';
else
val2=0;
}
3.对竖式的每一列式子进行相加:
//对竖式的每一列式子进行相加
sum=val1+val2+carry;
//对相加得出得结果>=10进行处理
if(sum>9)
{
carry=sum/10;
sum%=10;
}
else
{
carry=0;
}
- 把相加得出结果转化回字符串:
//把相加得出结果转化回字符串
addret+=(sum+'0');
5.处理carry==1的情况:
//处理carry==1的情况
if(carry==1)
{
addret+='1';
}
6.把相加后的字符串结果进行逆置:
//把相加后的字符串结果进行逆置
reverse(addret.begin(),addret.end());
我们看一下该代码的运行结果
测试用例没问题了,我们再提交一下。(提交时间和击败多少用户不必在意,这个是leetcode特色,和你的网速有关)
代码总结:(oj平台上的代码)
class Solution
{
public:
string addStrings(string num1, string num2)
{
//定义end1和end2分别指向字符串num1和num2的末尾
int end1=num1.size()-1, end2=num2.size()-1;
int carry=0;
//存放数字相加的结果
int sum=0;
//存放相加后转成的字符串
string addret;
//用于存放字符串转化为数字
int val1=0,val2=0;
//只要有一个位数>=0循环就不能停止
while(end1>=0||end2>=0)
{
//对字符串num1进行转化成数字
if(end1>=0) val1=num1[end1--]-'0';
else
val1=0;
//对字符串num2进行转化成数字
if(end2>=0) val2=num2[end2--]-'0';
else
val2=0;
//对竖式的每一列式子进行相加
sum=val1+val2+carry;
//对相加得出得结果>=10进行处理
if(sum>9)
{
carry=1;
sum-=10;
}
else
{
carry=0;
}
//把相加得出结果转化回字符串
addret+=(sum+'0');
}
//处理carry==1的情况
if(carry==1)
{
addret+='1';
}
//把相加后的字符串结果进行逆置
reverse(addret.begin(),addret.end());
return addret;
}
};