持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给定一个字符串 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
二、思路分析:
依题意,当字符串存在2k的长度时,对字符串进行处理
(1)先声明一个返回结果的空字符串result,然后根据字符串的长度slen进行while,当slen大于0时才循环
(2)使用index变量记录每一次处理字符串的首字母下标,然后通过字符串切片的方式对所需的前k个字符的字符串进行反转,接着再拼接在result的后面,将剩余的K个字符原封不动地拼接到result后面,然后将index+2k,改变下一次开始处理的字符串下标,此时slen应减去2*K个长度
(3)当slen < k时,直接将剩余的字符利用字符串切片的方式反转,然后再拼接到result,接着break退出循环
(4)当slen < 2k && slen >= k时,将剩余字符串的前k个字符串反转,再拼接到result,接着break退出循环
(5)最后返回结果result
三、AC 代码:
class Solution {
public String reverseStr(String s, int k) {
int n = s.length();
char[] ch = s.toCharArray();
for(int i = 0; i < s.length(); i += 2*k ){
int start = i;
int end = Math.min(n - 1,start + k - 1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
范文参考:
反转字符串 II(在一个个固定区间内进行反转,即首a和尾b交换,再a++、b--继续交换) - 反转字符串 II - 力扣(LeetCode)