LeetCode刷题:415.字符串相加

前言

  • 文章作为日记或心得,记录学习过程
  • 本文记录本题(源自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)

猜你喜欢

转载自blog.csdn.net/wwz1751879/article/details/107776137