在使用reverse库函数时,有一个重要的易错点就是指定反转的区域,在leetcode541中,没使用库函数可以轻松过关,但改用库函数后发现一直有小问题。这是因为库函数revers(s.begin(),s.end()),的作用区域没有搞明白
revers(s.begin(),s.end())是将s整体反转,但回想一下,end()是最后一个元素的下一位的迭代器,所以如果我们想将区间it后的5个子字符串反转时,需要将作用区域设置为it+6,即reverse(it,it+6)
顺便把541题目答案贴一下
1.使用库函数
class Solution {
public:
string reverseStr(string s, int k) {
int i=0;
while((i+k)<s.size())
{
int q=i+k;
reverse(s.begin()+i,s.begin()+q);
i+=2*k;
}
reverse(s.begin()+i,s.end());
return s;
}
};
2.自己转换
class Solution {
public:
string reverseStr(string s, int k) {
int i=0;
while((i+k)<s.size())
{
int p=i,q=i+k-1;
while(p<q)
{
char temp=s[p];
s[p++]=s[q];
s[q--]=temp;
}
i+=2*k;
}
if(int nums=(s.size()-i))
{
int p=i,q=i+nums-1;
while(p<q)
{
char temp=s[p];
s[p++]=s[q];
s[q--]=temp;
}
}
return s;
}
};
两种方式最大的区别就是反转区别的右端q是否减1,这就是因为reverse的右端作用域是指向要反转字符的下一位置