[leetCode]541. 反转字符串 II
csdn:https://blog.csdn.net/renweiyi1487/article/details/109330386
题目
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
提示:
该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。
双指针
思路:计算字符串一共能以2k的长度分为几段,然后按照每段进行反转。每段处理完成后按照规则处理剩余部分。
class Solution {
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int n = chars.length;
int section = n / (2*k);
int i = 0;
while (i < section) {
int begin = i * 2 * k;
int end = begin + k - 1;
reverse(chars, begin, end);
i++;
}
int leaveLen = n - (i * 2 * k);
if (leaveLen <= k) {
reverse(chars, i * 2 * k, n - 1);
} else if (leaveLen < 2 * k && leaveLen >= k) {
reverse(chars, i *2 * k, i * 2 * k + k - 1);
}
return new String(chars);
}
private void reverse(char[] chars, int begin, int end) {
while (begin < end) {
char temp = chars[begin];
chars[begin] = chars[end];
chars[end] = temp;
begin++;
end--;
}
}
}
另外一种写法,利用for循环分段处理
在for循环中利用i += (2 * k)
即可分段处理
class Solution {
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int n = chars.length;
for (int i = 0; i < n; i += 2*k) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= n) {
reverse(chars, i, i + k - 1);
continue;
}
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(chars, i,n-1);
}
return new String(chars);
}
private void reverse(char[] chars, int begin, int end) {
while (begin < end) {
char temp = chars[begin];
chars[begin] = chars[end];
chars[end] = temp;
begin++;
end--;
}
}
}