版本一: i
每次增加2 * k
,这样每次循环i
都可以到达要截取的字符串的起点,然后再判断i + k
是否小于等于字符串长度,若小于等于的话,则反转[i,i+k]
区间,否则就是到了剩下的字符小于k
个了,直接反转[i,end]
。
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += (2 * k)){
if(i + k <= s.size()){
reverse(s.begin() + i, s.begin() + i + k);
}else{
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
版本二:
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size(), pos = 0;
while(pos < n){
if(pos + k < n) reverse(s.begin() + pos, s.begin() + pos + k);
else reverse(s.begin() + pos, s.end());
pos += 2 * k;
}
return s;
}
};
时间复杂度
:
O
(
n
)
O(n)
O(n)
空间复杂度
:
O
(
1
)
O(1)
O(1)