Leetcode——541. 反转字符串 I
题解一
思路
新引进了一个字符串对象,它相比String是可修改的,多线程安全的,通过它和String的一些方法,完成操作。
代码
class Solution {
public String reverseStr(String s, int k) {
StringBuffer res = new StringBuffer();
int length = s.length();
int start = 0;
while(start < length){
int firstK = (start + k < length) ? start + k : length;
int secondK = (start + 2 * k < length) ? start + 2 * k : length;
StringBuffer t = new StringBuffer(s.substring(start, firstK));
res.append(t.reverse());
start += 2 * k;
if(firstK < secondK){
res.append(s.substring(firstK, secondK));
}
}
return res.toString();
}
}
总结
新学习了一个StringBuffer类型,相比String来说,具有可操作(增删改和反转),多线程安全的特性。巩固了String对象的substring()方法(这里的string居然是小写),区间是大于等于a,小于b(例如s.substring(a,b))。
解法二
思路
通过start和end指针的移动,实现替换操作,第六行通过一个函数判断出需要反转的区间,然后通过i += 2 * k 来保留不需要反转的部分。
代码
class Solution {
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();
for(int i = 0; i < arr.length; i += 2 * k){
int start = i;
int end = Math.min(arr.length-1, start + k-1);
while(start < end){
char temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
return new String(arr);
}
}
总结
这种替换方法,上一篇还没觉得多好用,这一篇直接就体现出来了,第六行的比较也可以用三元运算符,交换的部分也可以额外写一个函数替代。
个人对于这种题的解答,过于追求对过程的模拟,例如在我刚写的时候我特别想把star~start+k,start+k~start+2k,分开进行判断,以及对数组剩余长度的判断,但是回头一看分的实在有点太碎了,如这个题解就非常的清晰,但是我并不能完整的思考出来,还是需要精进。