题目
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
思路
首先考虑到String 是不可变得,我们转化为数组,原地交换就可以了。
如何交换?
我们每2k 个字符进行一次交换
,每次交换前k个
,交换的区间为 start ~ start+k
解法
双指针
class Solution {
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int k2 = 2*k;
for(int i =0;i<chars.length;i+=k2) {
int start = i;
int end = Math.min(chars.length-1,start+k-1); //注意start+k 要减1 ,因为是数组下标从0开始。
while(start<end) {
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
}
return String.valueOf(chars);
}
}