题一:
125. 验证回文串 - 力扣(LeetCode)https://leetcode.cn/problems/valid-palindrome/submissions/
解决此题之前首先来学习一个库函数:
代码解析:
class Solution {
public:
bool IsNumberOrLetter(char c)
{
if(c>='a'&&c<='z')
return true;
if(c>='A'&&c<='Z')
return true;
if(c>='0'&&c<='9')
return true;
return false;
}
bool isPalindrome(string s)
{
int begin=0,end=s.size()-1;
while(begin < end)
{
while(begin<end && !IsNumberOrLetter(s[begin]))
{
begin++;
}
while(begin<end && !IsNumberOrLetter(s[end]))
{
end--;
}
if(tolower(s[begin])!=tolower(s[end]))
return false;
begin++;
end--;
}
return true;
}
};
题二:
415. 字符串相加 - 力扣(LeetCode)https://leetcode.cn/problems/add-strings/
注意std提供的reverse函数需要传起始位置和末尾位置的迭代器
代码解析:
法一:
class Solution {
public:
string addStrings(string num1, string num2)
{
string s;
int p1=num1.size()-1,p2=num2.size()-1;
int next=0;//表示进位
int num=0;
while(p1>=0 || p2>=0)//任意一个为真都会进入循环,意味着两个同时遍历结束
{
int x1=0,x2=0;//每次循环都定义为0
if(p1>=0)
{
x1=num1[p1]-'0';//注意要将char类型转换成int类型,需要减字符0
}
if(p2>=0)
{
x2=num2[p2]-'0';
}
num=x1+x2+next;
if(num>9)
{
num=num%10;
s+=num+'0';//注意要将int类型转换成char类型,需要加字符0
next=1;
}
else
{
s+=num+'0';
next=0;
}
p1--;
p2--;
}
if(next!=0)//最后处理剩余的进位
s+='1';
reverse(s.begin(),s.end());
return s;
}
};
法二:
class Solution {
public:
string addStrings(string num1, string num2)
{
string s;
int p1=num1.size()-1,p2=num2.size()-1;
int next=0;//表示进位
int num=0;
int x1=0,x2=0;
while(p1>=0 && p2>=0)//其中一个结束循环就结束
{
x1=num1[p1]-'0';//注意要将char类型转换成int类型,需要减字符0
x2=num2[p2]-'0';
num=x1+x2+next;
if(num>9)
{
num=num%10;
s+=num+'0';//注意要将int类型转换成char类型,需要加字符0
next=1;
}
else
{
s+=num+'0';
next=0;
}
p1--;
p2--;
}
//循环结束过后判断到底是哪一个字符串先结束
while(p1>=0)
{
x1=num1[p1]-'0';
x2=0;
num=x1+x2+next;
if(num>9)
{
num=num%10;
s+=num+'0';//注意要将int类型转换成char类型,需要加字符0
next=1;
}
else
{
s+=num+'0';
next=0;
}
p1--;
}
while(p2>=0)
{
x1=0;
x2=num2[p2]-'0';
num=x1+x2+next;
if(num>9)
{
num=num%10;
s+=num+'0';
next=1;
}
else
{
s+=num+'0';
next=0;
}
p2--;
}
if(next!=0)//最后处理剩余的进位
s+='1';
reverse(s.begin(),s.end());
return s;
}
};
题三:
力扣https://leetcode.cn/problems/reverse-string-ii/
代码解析:
法一:
class Solution {
public:
string reverseStr(string s, int k)
{
int begin1=0,begin2=0;
int n=s.size();//用n记录字符串存放字符的个数
int r=(n+k)/4;//找到需要反转的字符次数与个数的关系,利用反转的字符次数来循环
int num=0;
while(r)
{
begin1=num*2*k;//定义反转开始的位置
if(n-begin1>k)//如果剩余的个数大于k,那么begin2跳转即可
{
begin2=begin1+k-1;
}
else//如果小于等于k个
{
begin2=n-1;
}
while(begin1<=begin2)//循环反转
{
swap(s[begin1],s[begin2]);
begin1++;
begin2--;
}
num++;//跳到下一组的开头
r--;//反转次数每次减1
}
return s;
}
};
法二:
class Solution {
public:
string reverseStr(string s, int k)
{
int begin1=0,begin2=0;
int n=s.size();//用n记录字符串存放字符的个数
int r=(n+k)/4;//找到需要反转的字符次数与个数的关系,利用反转的字符次数来循环
int num=0;
while(r)
{
begin1=num*2*k;//定义反转开始的位置
if(n-begin1>k)//如果剩余的个数大于k,那么begin2跳转即可
{
begin2=begin1+k;
}
else//如果小于等于k个
{
begin2=n;
}
reverse(s.begin()+begin1,s.begin()+begin2);
num++;//跳到下一组的开头
r--;//反转次数每次减1
}
return s;
}
};