day8
问题:没有读懂题。不知道是每一个 2k 都去反转一次。
不要被绕进去
其实总的就可以分为两种情况。
反转 k 个,这个时候要判断需要反转的是不是够,也就是不要越界。有一个 if 判断,如果反转成功,直接continue,到下一段
不反转 k 个(末尾 < k
注意点:
1. i并不是每次都是 ++ -- ,不要养成定向思维了。。
2. reverse 函数可以指定从哪反转到哪
3. 如果是库里面的reverse函数,区间是左闭右开的。这里是自己实现的,左闭右闭。所以在调用的时候注意参数区间。不要越界
二刷:
1. 知道是分段来计算,但忘记了可以直接分为两种情况。
2. i 表示的是一段字符串的开头, 如果 +k -1 满足条件,就直接反转k。不满足就全部反转
class Solution {
public:
// 处理分为两段。反转 k 个,不反转 k 个
void reverse(string &s, int start,int end){
int i = start , j = end;
for(;i <= j;i++, j--)
swap(s[i],s[j]);
}
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += 2 * k)
{
// 因为这里要反转 k 个,要判断 i + k - 1是否超出了字符串的大小
if( i + k - 1 < s.size() ) // 前部分满足 2k + 末尾满足 > k
{
reverse(s,i,i + k - 1);
continue;
}
// 不反转 k 个
reverse(s,i,s.size() - 1); // 末尾处理 < k 的情况
}
return s;
}
};