力扣:58 - I 翻转单词顺序

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

描述

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

  • 示例 1:
1
2
arduino复制代码输入: "the sky is blue"
输出: "blue is sky the"
  • 示例 2:
1
2
3
makefile复制代码输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 示例3
1
2
3
makefile复制代码输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
  • 提示
1
2
3
4
复制代码无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

解析

利用两个指针,一个快,一个慢,快指针遇到空格就停下来,把经过的非空放到stringbuilder中,要加上中间的空格” “,注意substring的写法,别写成subString,然后这个函数是前闭后开 之后快指针遇到空格就跳过,直到遇到新的不为空的,把慢指针挪过去j = i,继续下一个单词的计数,注意最后的单词,后面还跟着” “,需要再trim()一下

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
arduino复制代码class Solution {
   public String reverseWords(String s) {
       //双指针
       String ss = s.trim();//去掉首尾的空格
       int i = ss.length() - 1; int j = i;
       StringBuilder sb = new StringBuilder();
       while(i >= 0){
           while (i >= 0 && ss.charAt(i) != ' ') i--;
           sb.append(ss.substring(i+1,j+1)+" ");//前闭后开 注意这个substring 不是驼峰命名 不要搞错了
           while (i >= 0 && ss.charAt(i) == ' ') i--;
           j = i;
      }
       return sb.toString().trim();

  }
}

运行结果:

执行结果:通过

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:35.3 MB, 在所有 Java 提交中击败了84.82%的用户

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%