题目描述
给定一个字符和一个整数k
,你需要对从字符开头算起的每个2k
个字符的前k
个字符反转。
如果剩余少于k
个字符,则将剩余的所有全部反转;如果有小于2k
但大于等于k
个字符,则反转前k
个字符,并将剩余的字符保持原样。
示例1:
输入: s= “abcdefg”, k = 2
输出: “bacdfeg”
要求:
- 该字符串只包含小写的英文字母;
- 给定字符串的长度和
k
在[1, 10000]
范围内;
思路分析
难度是简单 ,这里选择借助辅助容器StringBuilder
为返回结果res
;根据题意分析,我们只需要在[i, i + k)
内倒序添加字符;剩下的s.length() - i < k
,故最后的末尾单独进行处理倒序添加即可;
解题代码
public static String solution(String s, int k) {
int i = 0;
StringBuilder res = new StringBuilder();
for (int j = i + k - 1; i < s.length() && (i + k) < s.length(); i += 2 * k) {
while (j >= i) {
res.append(s.charAt(j--));
}
res.append(s.substring(i + k,
(i + 2 * k) < s.length() ?
(i + 2 * k) : s.length()));
j = i + 3 * k - 1;
}
// less than k
int numIter = s.length() - i;
i = 0;
while (numIter-- > 0) {
res.append(s.charAt(s.length() - ++i));
}
return res.toString();
}
复杂度分析
这里我们设n
为输入字符串的长度;
时间复杂度: 我们对字符串进行了一次遍历,故时间复杂度为O(n)
;
空间复杂度: 我们借助辅助容器res
,故空间复杂度为O(n)
;
Github源码
完整可运行文件请访问GitHub。