【LeetCode-中等题】 151. 反转字符串中的单词

题目

在这里插入图片描述

方法一:双指针去除空格

核心代码去除首尾以及中间多余空格(在原串上修改)
在这里插入图片描述

 //去除首尾以及中间多余空格(在原串上修改)
    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
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45618869/article/details/132898169