题目
https://leetcode-cn.com/problems/reverse-string-ii/
题目的意思其实概括为 每隔2k个反转前k个,尾数不够k个时候全部反转。而不要再去判断是不是2k。
思路
与反转字符串基本思路一致。有区别的就是要如何对有关k的各种情况的选择。
一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。然后再start=2k到我们未知的地方(要么是够k,要么是不够,也就是我们对end的设置)
所以当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。
这里便是把i当作start来定下区间的范围。
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
for(int i=0; i<c.length; i+=2*k){
int start = i;
//这里是判断尾数够不够k个来取决end指针的位置
//前者是不够k个,后者是够
int end = Math.min(c.length - 1, start + k - 1);
reverse(c,start,end);
}
return new String(c);
}
void reverse(char[] cs, int l, int r) {
while (l < r) {
char c = cs[l];
cs[l] = cs[r];
cs[r] = c;
l++; r--;
}
}