题目(leecode T541):
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
方法:本题和昨天的题目的区别仅在于昨天是整个字符串反转,而本题只是反转固定的其中一部分,并且是有规律的一部分,即每2k个数字的前k个,因此我们对于每2k个元素的处理逻辑是一样的。这种情况下就可以考虑在for循环中做文章,将变量每次自增2k个元素即可。然后对于每2k个元素进行判断,前k个元素如何长度大于k,就反转前k个,然后继续循环。如果小于k的话就直接反转剩余的所有元素就结束了。
题解:
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += (2 * k)){ //重点是每次自增2k个元素
if(i + k < s.size()){ //判断剩余要反转的元素是否越界了
reverse(s.begin() + i, s.begin() + i + k); //没越界,反转
}
else{
reverse(s.begin() + i,s.end()); //越界了,反转剩余元素
}
}
return s;
}
};