剑指Offer系列之「翻转单词顺序列」

给定一个首尾可能带空格的字符串,请让你翻转该字符串。首尾不能有多余空格。如果全部是空格,请返回原字符串。

例如将 “student. a am I” 翻转为 “I am a student.”

首先需要进行预处理,判断输入字符串是不是全部空格,如果是,直接输出字符串。

把每个单词拆分出来,然后以单词为翻转单元,即可得到结果串。

一个单词为:从不是空格的字符开始到是空格的前一个字符结束,即为一个单词。

public class Solution {
    
    
    public String ReverseSentence(String str) {
    
    
        if(str == null) return str;
        int len = str.length();
        int i = 0;
        while(i<len && str.charAt(i) == ' ') i++;
        if(i == len) return str;
        
        String res = "";
        String tmp = "";
        boolean hasWord = false; // 是否已经形成一个单词
        for(int j = len-1; j >=0; j--){
    
    
            if(str.charAt(j) != ' '){
    
    
                tmp = str.charAt(j) + tmp;
                hasWord = true;
            }else if(str.charAt(j) == ' ' && hasWord == true){
    
    
                res = res + tmp + " ";
                tmp = "";  // 重置 tmp
                hasWord = false;  // 重置 hasWord
            }
        }
        if(tmp != ""){
    
    
            res += tmp;
        }
        return res;
    }
}

StringBuilder实现:

public class Solution {
    
    
    public String ReverseSentence(String str) {
    
    
        if(str == null) return str;
        int len = str.length();
        int i = 0;
        while(i<len && str.charAt(i) == ' ') i++;
        if(i == len) return str;
        
        StringBuilder res = new StringBuilder();
        StringBuilder tmp = new StringBuilder();
        boolean hasWord = false;
        for(int j = len-1; j >=0; j--){
    
    
            if(str.charAt(j) != ' '){
    
      
                tmp.insert(0,str.charAt(j));
                hasWord = true;
            }else if(str.charAt(j) == ' ' && hasWord == true){
    
    
                res = res.append(tmp).append(" ");
                //tmp = new StringBuilder();
                tmp.delete(0, tmp.length()); // 这里用delete避免产生新的对象
                hasWord = false;
            }
        }
        if(tmp.length() != 0){
    
    
            res.append(tmp);
        }
        str = res.toString();
        return str;
    }
}

时间复杂度:O(N)
空间复杂度:O(N),因为没有在原字符串上进行翻转,所以需要额外的空间

猜你喜欢

转载自blog.csdn.net/weixin_44471490/article/details/108986023