编程题:
题一:字符串相加
415. 字符串相加 - 力扣(LeetCode)
思路一:
第一步:需要获取字符串的两个尾节点下标;
第二步:创建用于记录进位数、获得的字符串的变量;
第三步:只要有进位或还有数没有加完继续循环:利用三目运算:有符号+符号,无符号+0;
第四步:最后将得到的字符串逆置,就是需要的结果。
class Solution {
public:string addStrings(string num1, string num2) {//获取字符串的尾节点int it1 = num1.size() - 1;int it2 = num2.size() - 1;//记录进位数int count = 0;//获得的字符串string s1 = "";//有进位或还有数没有加完while(it1 >= 0 || it2 >= 0 || count != 0){//三目运算:有符号+符号,无符号+0int x = it1 >= 0 ? num1[it1] - '0' : 0;int y = it2 >= 0 ? num2[it2] - '0' : 0;int n = x + y + count;int num = n % 10;count = n / 10;s1.push_back(num + '0');--it1;--it2;}//得到的是逆置的字符串reverse(s1.begin(),s1.end());return s1;}
};
题二:验证回文串
125. 验证回文串 - 力扣(LeetCode)
思路一:
第一步:遍历字符串将大写改小写并删除非字母和数字的字符;
第二步:判断对称比较字符是否相等;
class Solution {
public:bool isPalindrome(string s) {//遍历字符串将大写改小写并删除非字母和数字的字符for(int i = 0; i < s.size();i++){s[i] = tolower(s[i]);if((s[i] < 'a' || s[i] > 'z') && (s[i] < '0' || s[i] > '9')){s.erase(i,1);i--;}}//对称比较字符是否相等int left = 0;int right = s.size() - 1;while(left < right){if(s[left] != s[right]){return false;}left++;right--;}return true;}
};
题三:反转字符串
541. 反转字符串 II - 力扣(LeetCode)
思路一:
第一步:分别创建记录起始位置和末尾位置的节点;
第二步:只要后面还有字符就继续执行循环:1.计数2k个字符,就反转这2k字符中的前k个字符;2.字符小于2k但大于或等于k个,则反转前k个字符;3.剩余字符少于k个,将剩余字符全部反转。
特别注意:reverse是逆置左闭右开的区间!!!
class Solution {
public:string reverseStr(string s, int k) {//分别创建记录起始位置和末尾位置的节点string::iterator cur = s.begin();string::iterator tail = s.end();//只要后面还有字符就继续执行while(cur != tail){//计数2k 个字符,就反转这2k字符中的前k个字符if(cur + 2*k <= tail){//需要注意reverse是左闭右开的区间reverse(cur,cur + k );cur += 2*k;}//字符小于2k但大于或等于k个,则反转前k个字符else if(cur + k <= tail){reverse(cur,cur + k );break;}//剩余字符少于k个,将剩余字符全部反转else{reverse(cur,tail);break;}}return s;}
};
思路二:
反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。
class Solution {
public:string reverseStr(string s, int k) {int n = s.length();for (int i = 0; i < n; i += 2 * k) {reverse(s.begin() + i, s.begin() + min(i + k, n));}return s;}
};
题四:反转字符串的单词
557. 反转字符串中的单词 III - 力扣(LeetCode)
思路一:
第一步:定义变量left、right从第一个字符开始,以及tail来记录字符串长度;
第二步:如果没有超过字符串长度就继续循环:1.定位一个单词的区间、2。逆置(我们这里用的是下标访问,无法使用reverse来进行逆置)、3.再排除空格的影响;
void my_reverse(string& s1,int left,int right)
{while(left < right){swap(s1[left],s1[right]);++left;--right;}
}
class Solution {
public:string reverseWords(string s) {int left = 0;int right = 0;int tail = s.size();//没有超过字符串长度就循环while(right < tail){//定位一个单词的区间while(s[right] != ' ' && s[right] != '\0'){++right;}//逆置my_reverse(s,left,right-1);//排除空格的影响while(s[right] == ' ')++right;left = right;}return s;}
};
题五:字符串相乘
43. 字符串相乘 - 力扣(LeetCode)
思路一:
第一步:创建:1.得到最后的结果的s1、2.count用于记录进位、enter用于记录进行了几次乘加;
第二步:while循环中1.n1做为被乘数,n2做为乘数,tmp用于记录当前的乘积,2.再内置一个while循环实现乘法,3.将所得结果逆置,4.对每一次的乘积进行当前结果求和(这里直接在题意字符串相加的基础上缩小了相加的范围实现了乘加);
第三步:最后:判断:如果字符串全为‘0’,则返回“0”,否则正常输出计算所得的字符串。
class Solution {
public:
string addStrings(string num1, string num2,int enter) {//获取字符串的尾节点int it1 = num1.size() - 1 -enter;int it2 = num2.size() - 1;//记录进位数int count = 0;//获得的字符串string s1 = "";//有进位或还有数没有加完while(enter--){s1.push_back(num1[it1+enter+1]);}while(it1 >= 0 || it2 >= 0 || count != 0){//三目运算:有符号+符号,无符号+0int x = it1 >= 0 ? num1[it1] - '0' : 0;int y = it2 >= 0 ? num2[it2] - '0' : 0;int n = x + y + count;int num = n % 10;count = n / 10;s1.push_back(num + '0');--it1;--it2;}//得到的是逆置的字符串reverse(s1.begin(),s1.end());return s1;}string multiply(string num1, string num2) {//得到最后的结果的s1string s1;//count用于记录进位int count = 0;//enter用于记录进行了几次乘加int enter = 0;//n1做为被乘数int n1 = num1.size() - 1;while(0 <= n1){//n2做为乘数int n2 = num2.size() - 1;//tmp用于记录当前的乘积string tmp;//实现乘法while(0 <= n2 || count != 0){int x = n1 >= 0 ? num1[n1] - '0' : 0;int y = n2 >= 0 ? num2[n2] - '0' : 0;int num = x * y + count;count = num / 10;tmp.push_back((num % 10) + '0');--n2;}//所得结果逆置reverse(tmp.begin(),tmp.end());//对每一次的乘积进行当前结果求和s1 = addStrings(s1,tmp,enter);++enter;--n1;}//判断:如果字符串全为‘0’,则返回“0”int nn = s1.size() ;while(nn--){if(s1[nn] - '0' != 0){return s1;}}return "0";}};
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!