1. 翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”。

  1. 示例 1
  2. 输入: "the sky is blue"
  3. 输出: "blue is sky the"
  4. 示例 2
  5. 输入: " hello world! "
  6. 输出: "world! hello"
  7. 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  8. 示例 3
  9. 输入: "a good example"
  10. 输出: "example good a"
  11. 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路:

  • 从头开始扫描,碰到空格字符跳过
  • 然后记录非空格字符串的前后索引位置
  • 截取单词存入String[]
  • 倒叙遍历String[],使用StringBuilder进行拼接
    class Solution {
      public String reverseWords(String s) {
          int length = s.length();
          if(length==0) return "";
          // if(s.equals(" ")) return "";  // 这里必须用equals,不能用"==" , 力扣未重写equals
          List<String> strList = new ArrayList<>();
          int left;
          int right;
          for(int i=0;i<length;i++){
              if(s.charAt(i)==' ') continue;
              left = i;
              while(i+1<length&&s.charAt(i+1)!=' '){
                  i++;
              }
              right = i+1;
              strList.add(s.substring(left,right));
          }
          String[] strArr = strList.toArray(new String[strList.size()]);
          StringBuilder sb = new StringBuilder();
          int strLength = strArr.length;
          for(int j=strLength-1;j>=0;j--){
              sb.append(strArr[j]).append(" ");
          }
          if(strLength==0){
              return "";
          }
          return sb.deleteCharAt(sb.length()-1).toString();
      }
    }