编程题:
题一:字符串相加
思路一:
第一步:需要获取字符串的两个尾节点下标;
第二步:创建用于记录进位数、获得的字符串的变量;
第三步:只要有进位或还有数没有加完继续循环:利用三目运算:有符号+符号,无符号+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) { //三目运算:有符号+符号,无符号+0 int 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; } };
题二:验证回文串
思路一:
第一步:遍历字符串将大写改小写并删除非字母和数字的字符;
第二步:判断对称比较字符是否相等;
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; } };
题三:反转字符串
思路一:
第一步:分别创建记录起始位置和末尾位置的节点;
第二步:只要后面还有字符就继续执行循环: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; } };
题五:字符串相乘
思路一:
第一步:创建: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) { //三目运算:有符号+符号,无符号+0 int 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) { //得到最后的结果的s1 string 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"; } };
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!