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

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

描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
复制代码
  • 提示
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
​
复制代码

解析

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

示例

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%的用户

猜你喜欢

转载自juejin.im/post/7035887117641187342