题目:541. 反转字符串 II 思路 本人想法:通过计数器,计数到2k时,翻转前k个,剩余的最后翻转。不过这种思路没有通过要求的全部案例,只能AC一部分案例。 学习正确做法
将翻转情况分为2种情况第一种:剩余字符数大于等于k个,则翻转前k个;第二种:剩余字符数小于k个,则全部翻转。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
int start = -1;
int end = -1;
for (int i = 0; i < ch.length; i += 2 * k) {
start = i;
// 确定翻转区间,左闭右闭[start, end]
// if (start + k <= ch.length) {
// // 剩余字符数大于等于k
// end = start + k - 1;
// } else {
// // 剩余字符数小于k
// end = ch.length - 1;
// }
end = Math.min(start + k, ch.length) - 1;
// 反转逻辑
while (start < end) {
char tmp = ch[start];
ch[start++] = ch[end];
ch[end--] = tmp;
}
}
return new String(ch);
}
}
另一种写法
public class Solution02 {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
// 每次走2k步,分2种情况进行反转
for (int i = 0; i < ch.length; i += 2 * k) {
// 剩余字符数大于或等于k,反转前k个
if (i + k <= ch.length) {
reverse(ch, i, i + k - 1);
continue; // 没有走到数组结束,继续
}
// 剩余字符数小于k个,全部反转
reverse(ch, i, ch.length - 1);
}
return new String(ch);
}
private void reverse(char[] ch, int start, int end) {
while (start < end) {
char tmp = ch[start];
ch[start++] = ch[end];
ch[end--] = tmp;
}
}
}
总结
Java中String为不可变类型,因此可以将String的数据存储到可变的数据类型中;方法1:采用String的toCharArray()方法转为char[];方法2:采用可变的StringBuilder或者StringBuffer;单线程使用StringBuilder效率高。



