题目描述:https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3?tpId=13&&tqId=11197&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

  思路:注意此题目没有 " A " 这种后台样例,所有可以使用 split 来解决这个问题,这个在下面的思路中说到,使用 StringBuilder 来记录答案,首先我们可以遍历字符串,当遇到 ' ' 的时候,如果是第一个 ' ', 此时我们需要翻转前面的字符串,然后拼接到答案中,如果不是则只用拼接 ' ' 即可。这样遍历的时候,最后一个字符串可能无法被我们保存下来,所以在最后如果最后一个字符串还没有被拼接我们就拼接。最后在翻转答案转为字符串返回即可。

public class Solution {
    public String ReverseSentence(String str) {
        if(str == null || str.equals("")) return "";
        int n = str.length();
        int pos = 0;
        StringBuilder ans = new StringBuilder();
        for(int i = 0; i < n; ++ i) {
            if(str.charAt(i) == ' ') {
                if(i != 0 && str.charAt(i - 1) != ' ') {
                    ans.append(new StringBuilder(str.substring(pos, i)).reverse());
                }
                ans.append(" ");
                pos = i + 1;
            }
        }
        if(pos < n) ans.append(new StringBuilder(str.substring(pos, n)).reverse());
        return ans.reverse().toString();
    }
}

  这种情况下是可以把末尾空格也进行翻转的。
图片说明

  下面是使用 split 函数分解之后在进行翻转,然后拼接,最后在翻转的结果,特判全都是空格的串可以顺利 AC,但是末尾空格不会进行翻转。

public class Solution {
    public String ReverseSentence(String str) {
        if(str == null || str.equals("")) return "";
        String[] strs = str.split(" ");
        if(strs.length <= 0) return str;
        StringBuilder[] strs1 = new StringBuilder[strs.length];
        for(int i = 0; i < strs.length; ++ i) {
            strs1[i] = new StringBuilder(strs[i]);
        }
        StringBuilder ans = new StringBuilder();
        for(int i = 0; i < strs1.length; ++ i) {
            strs1[i].reverse();
            if(i != 0) ans.append(" ");
            ans.append(strs1[i]);
        }
        return ans.reverse().toString();
    }
}

图片说明
  很显然,这种方法没有将末尾的空格进行翻转,但是在这道题目中也顺利 AC 了。