题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104
代码
class Solution {
public String reverseStr(String s, int k) {
int len = s.length();
char[] chars = s.toCharArray();
for (int i = 0; i < len; i=i+2*k) {
int r = i+k-1;
//如果r已经超过了len-1,那么就是需要把剩余的字符都反转
if(r<(len-1)){
reverse(chars,i,r);
}else {
reverse(chars,i,len-1);
}
}
String res = new String(chars);
return res;
}
//这个函数是用来反转指定区间范围内的字符串
public void reverse(char[] arr, int start, int end) {
int left = start;
int right = end;
while (left < right) {
char temp = arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
}
自己需要注意的地方
1、起初自己针对多种情况进行判断比较麻烦,没有利用循环每次加i=i+2*k这种方法,比较麻烦
2、最后返回字符串的时候不能用chars.toString(),因为这样会用下面这种方式转化
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
输出的结果并不是我们期望的形式
应该用下面这种方式来转化才是要输出的形式
String res = new String(chars);