此题就是翻转字符串加了条件判断,其它和普通翻转字符串无区别;指得注意的是,遍历时,可选择每次递增2k个,比起每次i++,要更加简便
//给定一个字符串 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⁴
// s 仅由小写英文组成
// 1 <= k <= 10⁴
//
//
// Related Topics 双指针 字符串 👍 552 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String reverseStr(String s, int k) {
char[] charArray = s.toCharArray();
int length = charArray.length;
//2k个2k个地遍历
for (int i = 0; i < length; i += 2 * k) {
//原字符串还有剩余
if (i + 2 * k < length) {
switchChar(charArray, i, i + k - 1);
continue;
}
if(i + k <= length) {
//原字符串无剩余,且原字符串长度大于 i + k
switchChar(charArray, i, i + k - 1);
} else {
//原字符串无剩余,且原字符串长度小于 i + k
switchChar(charArray, i, length - 1);
}
}
return new String(charArray);
}
private void switchChar(char[] charArray, int left, int right) {
while (left < right) {
char temp = charArray[left];
charArray[left] = charArray[right];
charArray[right] = temp;
left++;
right--;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
的