来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string-ii
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:输入:s = “abcd”, k = 2
输出:“bacd”
提示:1 <= s.length <= 104 s 仅由小写英文组成 1 <= k <= 104
思路:
这道题一开始剩余字符少于k以及大于或等于k那地方看的还有点绕,后来看懂了发现其实就是就是最后一部分反转的字符如果字符个数少于k就全部反转,否则就跟原本的操作一样。所以我们只需要将这个字符串每2k个字符进行处理就行,用一个for循环,然后 i 每次循环加上 2*k 即可,然后最后一个部分判断一下就行了。
至于如何对字符串进行反转,参考《反转字符串》这道题,使用双指针来进行。
本题Java代码:
class Solution {
private void reverse(char[] c, int start, int end) {
while (end > start) {
char tmp = c[start];
c[start] = c[end];
c[end] = tmp;
start++;
end--;
}
}
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i += (2 * k)) {
if (i + k >= c.length)
reverse(c, i, c.length - 1);
else
reverse(c, i, i + k - 1);
}
return new String(c);
}
}