这里是第四篇
主题:字符串处理
主要技巧:双指针法 加快遍历速度 如果需要处理循环嵌套时双指针也有奇效
反转字符串
反转使用双指针法即可,这里末尾的值可以直接获取到 加快遍历速度
双指针的经典用法
class Solution {
public void reverseString(char[] s) {
int i = 0,j = s.length - 1;
while(i < j){
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
i++;
j--;
}
}
}
反转字符串二
主要是对end指针的处理 两种情况,对比即可
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i += 2 * k){
int start = i,end;
end = Math.min(ch.length - 1,start + k - 1);
while(start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
替换空格
特征:数组填充
解法:预留空间,从后向前遍历
可以记住这个解法
补充一个知识点:SE基础
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量

class Solution {
public String replaceSpace(String s) {
if(s == null || s.length()==0){
return s;
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i <= s.length() - 1; i++) {
if (s.charAt(i) == ' ') {
stringBuilder.append(" ");
}
}
if(stringBuilder.length()==0){
return s;
}
int i = s.length() - 1;
// 空格拼接起来
s += stringBuilder.toString();
int j = s.length() - 1;
char[] chars = s.toCharArray();
while(i >= 0){
if(chars[i] == ' '){
chars[j--] = '0';
chars[j--] = '2';
chars[j] = '%';
}else{
chars[j] = chars[i];
}
i--;
j--;
}
return new String(chars);
}
}