前言
- 文章作为日记或心得,记录学习过程
- 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
正文
题目
解答
对字符串内的数字求和,需要复习字符串相应的操作。
string类中size()、length()和strlen()的区别
string nums = "567";
int i = nums.length() - 1;//字符串对应位置为0 1 2 3,最后有个“\0”,所以需要-1来访问最后一位的数字
int x = nums[i - 1];
cout << nums[i] << x << nums.length() << nums.size() << "\n" << endl;
reverse(nums.begin(), nums.end());
cout << nums << endl;
return 0;
输出结果为75433 765
由此可见,size()、length()相同,均返回字符数量,如“567”这样的长度就为3。可以对字符类型进行强制转换,但注意54是‘6’的ASCII码,所以需要再对其进行-‘0’的操作获得该值,以便于后面的加法运算。
思路即从字符串末尾相加,判断是否进位。若长度不相等,需要对短的补0。
那么先用i、j分别从两个数组的末尾位置开始取值,判断两值之和是否>10,将结果利用push_back函数放到字符串的最后,最后利用reverse(string.begin(),string,end()),将该字符串反置
//第一次成功运行
class Solution
{
public:
string addStrings(string num1, string num2)
{
//将i、j分别对应字符串的最后一个位置,add为进位量。nums先初始化为空
int i = num1.size() - 1, j = num2.size() - 1, add = 0;
string nums = "";
//对字符串进行循环遍历,只要i、j>=0或者add==1,就还可以进行
while (i >= 0 || j >= 0 || add == 1)
{
int x = (i >= 0) ? num1[i] - '0' : 0;
int y = (j >= 0) ? num2[j] - '0' : 0;
nums.push_back((x + y + add)%10 + '0');
add = (x + y + add) / 10;//之前这里忘了+add,应注意。
//可以发现上面两处都有(x + y + add),运行了两次计算,会导致计算次数的增加,应给予优化
i--; j--;
}
reverse(nums.begin(), nums.end());
return(nums);
}
};
class Solution
{
public:
string addStrings(string num1, string num2)
{
//将i、j分别对应字符串的最后一个位置,add为进位量。nums先初始化为空
int i = num1.size() - 1, j = num2.size() - 1, add = 0;
string nums = "";
//对字符串进行循环遍历,只要i、j>=0或者add==1,就还可以进行
while (i >= 0 || j >= 0 || add == 1)
{
int x = (i >= 0) ? num1[i] - '0' : 0;
int y = (j >= 0) ? num2[j] - '0' : 0;
int result = x + y + add;//将(x + y + add)赋值给result减少运算次数
nums.push_back(result % 10 + '0');//此处是一个整型和字符相加,可以成功运行
add = result / 10;
i--; j--;
}
reverse(nums.begin(), nums.end());
return(nums);
}
};
结果
总结
该题思路为竖式运算,主要问题存在于字符串及其函数的掌握。
- 可以用.length()和.size()的方法获得字符串的字符长度
- 可以通过[]访问指定位置的字符,该值使用int转类型后为ASCII码,可通过-'0’获得其值
- reverse()函数的运用使得最后处理极为方便
- 字符串也有push_back()函数
- 复习了?:的条件运算
- 关于如何考虑循环条件之类的能力仍然欠缺,如while (i >= 0 || j >= 0 || add == 1)