https://leetcode-cn.com/problems/reverse-string-ii/
先上自己写的
class Solution {
public String reverseStr(String s, int k) {
int flag = s.length() % (2 * k);
int count = 0;
char[] arr = s.toCharArray();
while(count < s.length() - flag - 1){
int left = count;
int right = count + k - 1;
reverse(arr,left,right);
count += 2 * k;
}
if(flag <= k){
reverse(arr,count,s.length() - 1);
}else{
reverse(arr,count,count + k - 1);
}
String res=new String(arr);
return res;
}
public void reverse(char[] a,int l, int r) {
char temp;
while(l < r) {
temp = a[l];
a[l] = a[r];
a[r] = temp;
l++;
r--;
}
}
}
思路:
1.先写一个reverse函数,用于反转固定长度的字符串。
2.对2k长度的字符串的前k个字符串做反转处理
3.对最后多出来的一段flag长度的字符串做特殊处理。
看了题解代码,比我简洁很多,贴上来放一放
class Solution {
public String reverseStr(String s, int k) {
char[] a = s.toCharArray();
for (int start = 0; start < a.length; start += 2 * k) {
int i = start, j = Math.min(start + k - 1, a.length - 1);
while (i < j) {
char tmp = a[i];
a[i++] = a[j];
a[j--] = tmp;
}
}
return new String(a);
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-string-ii/solution/fan-zhuan-zi-fu-chuan-ii-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个简洁好多啊,就是从左往右扫描字符串,然后每2k长度,互换0到k的字符串,它用Math.min完美处理了最后一段尾巴的情况,不用像我一样做特殊处理。