给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
正解
简单的一个模拟,定义好不同情况下字符串所要进行的操作即可
class Solution {
public static String reverseStr(String s, int k) {
StringBuffer buffer = new StringBuffer(s);
int left = 0;
int right = 0;
int temp = right;
while (right < s.length()) {//2k为一个划分,用left和right的下标定义该段
if ((right + 1) % (2 * k) == 0 && right != 0) {
left = temp;
temp = right+1;
change(buffer, left, right, k);
}
right++;
}
//这里对末尾的小于2k的字符串部分进行处理
right--;
if(temp<=right){
left=temp;
change(buffer, left, right, k);
}
return String.valueOf(buffer);
}
//不同段的核心判断代码
public static void change(StringBuffer str, int left, int right, int k) {
int num = right - left + 1;
String cut;
if (num < k) {
StringBuffer temp = new StringBuffer(str.substring(left, right+1));
temp.reverse();
cut = String.valueOf(temp);
str.replace(left, right+1, cut);
} else {
right = left + k;
StringBuffer temp = new StringBuffer(str.substring(left, right));
temp.reverse();
cut = String.valueOf(temp);
str.replace(left, right, cut);
}
}
}
其实在实践中我们可以发现字符串以2k为节点进行划分的,所以我们也可以截断for来跳转每一段去进行操作
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;
}
}
}