🌈个人首页: 神马都会亿点点的毛毛张
这个题目除了分类讨论就没什么了
1.题目描述
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
- 1 < = s . l e n g t h < = 1 0 4 1 <= s.length <= 10^4 1<=s.length<=104
s
仅由小写英文组成- 1 < = k < = 1 0 4 1 <= k <= 10^4 1<=k<=104
2.题解
2.1 直接法
class Solution {
public String reverseStr(String s, int k) {
// 将字符串转换为字符数组,方便操作
char[] chs = s.toCharArray();
// 计算完整的2k段的数量
int count = chs.length / (2 * k);
// 逐段反转每个完整的k个字符
for (int i = 0; i < count; i++) {
reverseStr(chs, 2 * i * k, 2 * i * k + k - 1);
}
// 处理剩余的字符
int mod = chs.length % (2 * k);
// 如果剩余的字符数大于或等于k,反转前k个字符
if (mod >= k) {
reverseStr(chs, 2 * count * k, 2 * count * k + k - 1);
} else {
// 如果剩余的字符数小于k,反转所有剩余的字符
reverseStr(chs, 2 * count * k, chs.length - 1);
}
// 将字符数组转换回字符串并返回
return new String(chs);
}
// 反转字符数组指定范围内的字符
public void reverseStr(char[] chs, int begin, int end) {
while (begin < end) {
// 暂存末尾字符
char c = chs[end];
// 将开头字符赋值给末尾位置,同时末尾索引向前移动
chs[end--] = chs[begin];
// 将暂存的末尾字符赋值给开头位置,同时开头索引向后移动
chs[begin++] = c;
}
}
}
2.2 双指针
class Solution {
public String reverseStr(String s, int k) {
// 将字符串转换为字符数组,方便对字符串进行操作
char[] chs = s.toCharArray();
// 初始化开始位置指针
int begin = 0, end;
// 逐段处理字符数组
while (begin < chs.length) {
// 计算剩余字符的长度
int reaminLen = chs.length - begin;
// 确定本段反转的结束位置
end = reaminLen >= k ? begin + k - 1 : chs.length - 1;
// 反转从begin到end的字符
reverseStr(chs, begin, end);
// 将起始位置指针向后移动2k位置
begin += 2 * k;
}
// 将字符数组转换回字符串并返回
return new String(chs);
}
// 反转字符数组中指定范围内的字符
public void reverseStr(char[] chs, int begin, int end) {
while (begin < end) {
// 暂存末尾字符
char c = chs[end];
// 将开头字符赋值给末尾位置,同时末尾索引向前移动
chs[end--] = chs[begin];
// 将暂存的末尾字符赋值给开头位置,同时开头索引向后移动
chs[begin++] = c;
}
}
}