给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
- 1 <= s.length <= $10^4$
- s 仅由小写英文组成
- 1 <= k <= $10^4$
题目来源:力扣(LeetCode)链接
题解:
class Solution {
public String reverseStr(String s, int k) {
int n = s.length();
char[] arr = s.toCharArray();
// count 用来记录每个2k长度的子串的初始下标
int count = 0;
while (n - count >= k) {
// 如果子串的长度大于等于k,就反转前k个字符
int l = count;
int r = l + k - 1;
while (l < r) {
char temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
l++;
r--;
}
// 更新count为下一个子串初始下标
count += 2 * k;
}
// 如果字符串长度或子串长度小于k,则所有字符全部反转
if (n - count > 0 && n - count < k) {
int l = count;
int r = n - 1;
while (l < r) {
char temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
l++;
r--;
}
}
return new String(arr);
}
}