541.反转字符串II
简单的反转不够看,来一手花式反转
- 题目描述
给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k
个字符,就反转这2k
个字符中的前k
个字符。
1、如果剩余字符少于k
个,则将剩余字符全部反转
2、如果剩余字符小于2k
个,但大于或等于k
个,则反转前k
个字符,其余字符保持原样
- 题解
这里先解释一下题目的意思,以及所给出的示例
这道题呢,结合示例1来看,s=“abcdefg”,给出的k=2
那么2k就等于4
根据题目的意思,我们需要从字符串开头算起,找到第2k个字符,也就是d,然后我们需要反转a-d这四个字符的前k个字符,也就是反转前两个字符,a和b
所以此时得到“bacdefg”
接下来继续计数,后面的efg,只剩下三个字符,小于2k,但是大于k,所以反转前k个字符,也就是e和f
所以得到“bacdfeg”
接下来只剩下1个字符g,小于k,所以原地反转
最终的结果为“bacdfeg“
这道题我们使用双指针解法,因为本质还是交换两个数组中元素的位置,只不过额外的限制条件多了
在遍历字符串的过程中,只要让i=i+(2*k),也就是i每次移动2k个位置就可以了,然后判断是否有反转区间
总结一句话就是,每隔2k个字符,就反转前k个字符,不够2k个字符,字符全部反转
public String reverseStr(String s, int k) {
//将字符串转为char数组
char[] ch = s.toCharArray();
//i每次加2k个单位
for(int i=0;i<ch.length;i+=2*k){
//起始位置指针
int start = i;
//终止位置指针
//判断尾数够不够k个来决定end的位置
int end = Math.min(ch.length-1,start+k-1);
while(start<end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}