思路&java代码
思路:定义一个函数 partialRe,专门用来反转字符串。利用 for 循环中的 i += 2*k 作为步数。
class Solution {
public String reverseStr(String s, int k) {
char[]a = s.toCharArray();
int len = a.length;
for(int i=0; i<len; i += 2*k) {
int left = len-i;
if(left < k) {//len-i刚好是剩余字符的长度
partialRe(a,i,len-1);
} else if (left >= k && left < 2*k) {
partialRe(a,i,i+k-1);
} else {//还有至少2k个
partialRe(a,i,i+k-1);
}
}
String str = String.valueOf(a);
return str;
}
private void partialRe(char[] a, int l, int r) {
for(int i=l,j=r; i<=j; i++,j--) {
char temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
;
我的错误: partialRe函数中 交换的是 a[i] 和 a[j] ,而不是 a[l] 和 a[r]
改进
看了代码随想录的代码后,有改进的地方。
我的代码中,if else 逻辑是冗余的,且三个if else都可以合并。因为三种情况都会有反转,只是需要确定起始位置start和结束位置end,
int start = i;
//这里是判断尾数够不够k个来取决end指针的位置
int end = Math.min(a.length - 1, start + k - 1);
Java语言点
- String转换成char数组:String->char[]
利用 toCharArray方法
String s = "xxxxxxxxx"
char[]a = s.toCharArray();
- char数组转换成 String:char[] -> String
valueOf 或者 new String
char[]a = ['a', 'b', 'c'];
//方法一
String str = String.valueOf(a);
//方法二
String str = new String(a);
- 用异或运算反转
char[] ch = s.toCharArray();
//省略
while(start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}