文章目录
- 题目
- 方法一:双指针去除空格
题目
方法一:双指针去除空格
核心代码去除首尾以及中间多余空格(在原串上修改)
//去除首尾以及中间多余空格(在原串上修改)
public StringBuilder trimSpaces(String s) {
int len = s.length();
StringBuilder str = new StringBuilder(s);
int slow = 0;
for(int fast = 0;fast<len;fast++){
if(s.charAt(fast) != ' '){
if(slow !=0) str.setCharAt(slow++,' ');//如果当前slow处于第一个位置,遇到字母时就不需要先添加空格
while(fast<len && s.charAt(fast) != ' '){//这里同步移动fast 和slow指针 一定要保证fast指针在字符串长度范围内
str.setCharAt(slow++,s.charAt(fast++));
}
}
}
str = str.delete(slow,len);//处理完后 删除后面多出来的字符(因为是原地修改的,最后slow后面的所有字符都需要删掉)
return str;
}
完整代码
class Solution {
public String reverseWords(String s) {
//去除首尾以及中间多余空格
StringBuilder sb = trimSpaces(s);
// 反转整个字符串
reverse(sb,0,sb.length()-1);
// 反转各个单词
reverseEachWord(sb);
return sb.toString();
}
//去除首尾以及中间多余空格(在原串上修改)
public StringBuilder trimSpaces(String s) {
int len = s.length();
StringBuilder str = new StringBuilder(s);
int slow = 0;
for(int fast = 0;fast<len;fast++){
if(s.charAt(fast) != ' '){
if(slow !=0) str.setCharAt(slow++,' ');//如果当前slow处于第一个位置,遇到字母时就不需要先添加空格
while(fast<len && s.charAt(fast) != ' '){//这里同步移动fast 和slow指针 一定要保证fast指针在字符串长度范围内
str.setCharAt(slow++,s.charAt(fast++));
}
}
}
str = str.delete(slow,len);//处理完后 删除后面多出来的字符(因为是原地修改的,最后slow后面的所有字符都需要删掉)
return str;
}
//反转字符串指定区间[start, end]的字符
public void reverse(StringBuilder s,int start,int end){
while(start < end){//二分法逆转
char temp = s.charAt(start);
s.setCharAt(start,s.charAt(end));
s.setCharAt(end,temp);
start++;
end --;
}
}
// 反转各个单词
public void reverseEachWord(StringBuilder s){
int temp = 0;
for(int i = 0 ; i<s.length() ; i++){
if(s.charAt(i) != ' ') temp++;//使用一个temp变量来记录单词字符个数
else{
reverse(s,i-temp,i-1);
temp = 0;//处理完一个单词就让temp置为0
}
}
reverse(s,s.length()-temp,s.length()-1);//由于字符串最后是不会出现空格的,所以需要单独处理最后一个单词 单词长度就位temp
}
}