题目
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
思路:
规则有很多,其一,每隔2k字符,前k个字符进行反转;
其二,剩余字符如果小于2k但大于等于k,反转前k个
其三,剩余字符小于k的,全部反转。
根据这三个规则,我们考虑对字符串数组进行遍历,因为本字符串都是每隔2k个字符进行操作,所以用for循环遍历可以考虑每次增加2k个。一步一步的写,如果不知道判断条件如何处理边界,可以手动代入一个例子去解释。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray(); //将字符串转变为字符串数组
//1、每隔2k个字符,前k个字符进行反转
for(int i = 0; i < ch.length; i += (2*k)){
//2、剩余字符小于2k但大于等于k个,则反转前k个
if(i + k <= ch.length){
reverse(ch, i, i + k - 1);
continue;
}
//3、剩余字符少于k个,则将剩余字符全部反转
reverse(ch, i, ch.length - 1);
}
return new String(ch);
}
//定义翻转函数
public void reverse(char[] ch, int i, int j){
for(; i < j; i++, j--){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}
}