题目描述://输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",
//则输出"student. a am I"。
// 示例 1:
// 输入: "the sky is blue"
//输出: "blue is sky the"
// 示例 2:
// 输入: " hello world! "
//输出: "world! hello"
//解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
// 示例 3:
// 输入: "a good example"
//输出: "example good a"
//解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
// 说明:
// 无空格字符构成一个单词。
// 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
// 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解题思路:先将字符串的前后的空格删除,之后给出两个指针i和j分别表示字符串的末端指针,然后将指针i从后往前遍历字符串,循环遍历的字符不为空时,进行i--,当遍历到的字符为空时,跳出循环,然后字符串的索引i+1到j就是我们找到的第一个单词,使用String的substring方法,由于substring(beginIndex,endIndex)方法的endIndex索引不包括在截取的片段,所以需要j++才行。找到第一个单词之后存入StringBuild类里然后继续遍历i,若此时字符为空则执行i--;当不为空时,将j赋值给i,这样就和初始状态一般,再进行下一轮循环。最终大循环结束后,直接返回StringBuild即可。
代码如下:

class Solution {
    public String reverseWords(String s) {
               //删除前后空格
             s=s.trim();
              //建立一个StringBuilder类用来存放分割的字符串
        StringBuilder stringBuilder = new StringBuilder();
              //两个指针来存放字符串末端。
             int i=s.length()-1,j=i;
             //遍历字符串
            while (i>=0){
             //遍历字符为空时,执行i--;
            while (i>=0&&s.charAt(i)!=' ')i--;
             //将第一个单词存入stringBuilder
            stringBuilder.append(s.substring(i+1,j+1)+" ");
            //若有连续的空格则直接跳过进行i--;
            while (i>=0&&s.charAt(i)==' ')i--;
           //将索引i赋值给j,进行下一轮循环
            j=i;
        }
            //循环结束,输出  stringBuilder.toString().trim()
           return stringBuilder.toString().trim();
             }
    }