541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
思考
这次自己把简单问题复杂化了,也懒得重写了,就这吧
设置两个指针
- back:一次移动2k位
- pre:始终位于back-k
利用s.length()/(k*2)
获得back需要移动i
次
如果i<0
,即back一次都不需要移动,字符串长度位于0-2k之间
如果i>0
,即back需要移动
public static String reverseStr(String s, int k) {
if(k==1) return s;
char[] chars=new char[s.length()];
// 定义back移动i次 2k
int i=s.length()/(k*2);
int pre=0;
int back=0;
int index=0;
// 情况一
if(i==0){
// 介于 k - 2k 之间
if(s.length()-pre>k){
for (int j=k-1;j>=0;j--){
chars[index] = s.charAt(j);
index++;
}
for (int j=k;j<s.length();j++){
chars[index] = s.charAt(j);
index++;
}
}
else {
for (int j=s.length()-1;j>=0;j--){
chars[index] = s.charAt(j);
index++;
}
}
}
// 情况二
if(i>0){
while(i!=0){
int begin=back;
back=back+2*k;
pre=back-k;
for (int j=pre-1;j>=begin;j--){
chars[index]=s.charAt(j);
index++;
}
for (int j=pre;j<back;j++){
chars[index]=s.charAt(j);
index++;
}
i--;
}
// 判断剩余多少
if(s.length()-back>k){
for (int j=back+k-1;j>=back;j--){
chars[index]=s.charAt(j);
index++;
}
for (int j=back+k;j<s.length();j++){
chars[index]=s.charAt(j);
index++;
}
}else {
for (int j=s.length()-1;j>=back;j--){
chars[index]=s.charAt(j);
index++;
}
}
}
return new String(chars);
}