. - 力扣(LeetCode) -》》》》》题目链接
实现思路:计算数字符串长度并用数组的方式计算出字符位置,用字符的ask码+‘0’计算出字符本身。
class Solution { public:string addStrings(string num1, string num2) {string str;int end1 = num1.size()-1 , end2 = num2.size()-1;int next = 0;while(end1 >= 0 || end2 >= 0)//开始条件{int a1 = end1 >= 0 ? num1[end1--] -'0' : 0;int a2 = end2 >= 0 ? num2[end2--] -'0' : 0;int ret =a1 + a2 + next;next = ret / 10; //余数ret = ret % 10; //进位数str.insert(0, 1, '0' +ret);}if(next == 1)str.insert(str.begin() , '1');return str;} };
求出字符本身后用string库中自带的insert 表示在下标为0的位置处插入大小为1的字符
并if判断是否到最后有进位
注意时间复杂度为
那应该从那几个方面提高时间复杂度那
- 在方法一中是都是在下标为零的位置插入,每插入一次就会移动一次。--》头插在逆置
- 每几次相加后都会开一份空间 ---》开一次
#define _CRT_SECURE_NO_WARNINGS 1 class Solution { public:string addStrings(string num1, string num2) {string str;str.reserve(max(num1.size(), num2.size()) + 1);int end1 = num1.size() - 1, end2 = num2.size() - 1;int next = 0;while (end1 >= 0 || end2 >= 0){int a1 = end1 >= 0 ? num1[end1--] - '0' : 0;int a2 = end2 >= 0 ? num2[end2--] - '0' : 0;int ret = a1 + a2 + next;next = ret / 10;ret = ret % 10;// str += ('0' + ret); //尾插str.insert(str.begin(),'0'+ret);//用法一//str.insert(0, 1, '0' +ret);//用法二}if (next == 1)str += '1';/// str.insert(str.begin() , '1');reverse(str.begin(), str.end());//逆置return str;} };
reserve 迭代器区间
扩容有消耗 reserve 直接一次性开到最大