Leetcode 151. 翻转字符串里的单词

描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

 

链接

 151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)

 

代码

解法一:直接使用API

 1 class Solution {
 2     public String reverseWords(String s) {
 3         // 除去开头和末尾的空白字符
 4         s = s.trim();
 5         // 正则匹配连续的空白字符作为分隔符分割
 6         List<String> wordList = Arrays.asList(s.split("\\s+"));
 7         Collections.reverse(wordList);
 8         return String.join(" ", wordList);
 9     }
10 }

 

 

解法二:使用双指针

1、用 s.trim() 去除空格

2、用 split()方法,删除空格,分为 字符串数组

Java split() 方法 | 菜鸟教程 (runoob.com)

 

 

class Solution {
    public String reverseWords(String s) {
        s = s.trim(); //去掉首尾空格;
        StringBuilder res = new StringBuilder();
        int len = s.length();
        int i = len - 1, j = i; //从尾开始 往 前遍历,i指向句中单词的开头,j指向尾
        while (i >= 0) {
            while (i >= 0 && s.charAt(i) != ' ') { // 寻找空格
                i--;
            }
            res.append(s.substring(i+1, j+1) + ' '); //前开后闭;添加单词 和 空格
            while (i >= 0 && s.charAt(i) == ' ') {  //跳过空格;
                i--;
            }
            j = i;
        }
        return res.toString().trim();
    }
}

 

解法三:自己编写 去除 空格函数

 

 1 class Solution {
 2    /**
 3      * 不使用Java内置方法实现
 4      * <p>
 5      * 1.去除首尾以及中间多余空格
 6      * 2.反转整个字符串
 7      * 3.反转各个单词
 8      */
 9     public String reverseWords(String s) {
10         // System.out.println("ReverseWords.reverseWords2() called with: s = [" + s + "]");
11         // 1.去除首尾以及中间多余空格
12         StringBuilder sb = removeSpace(s);
13         // 2.反转整个字符串
14         reverseString(sb, 0, sb.length() - 1);
15         // 3.反转各个单词
16         reverseEachWord(sb);
17         return sb.toString();
18     }
19 
20     private StringBuilder removeSpace(String s) {
21         // System.out.println("ReverseWords.removeSpace() called with: s = [" + s + "]");
22         int start = 0;
23         int end = s.length() - 1;
24         while (s.charAt(start) == ' ') start++;
25         while (s.charAt(end) == ' ') end--;
26         StringBuilder sb = new StringBuilder();
27         while (start <= end) {
28             char c = s.charAt(start);
29             if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
30                 sb.append(c);
31             }
32             start++;
33         }
34         // System.out.println("ReverseWords.removeSpace returned: sb = [" + sb + "]");
35         return sb;
36     }
37 
38     /**
39      * 反转字符串指定区间[start, end]的字符
40      */
41     public void reverseString(StringBuilder sb, int start, int end) {
42         // System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]");
43         while (start < end) {
44             char temp = sb.charAt(start);
45             sb.setCharAt(start, sb.charAt(end));
46             sb.setCharAt(end, temp);
47             start++;
48             end--;
49         }
50         // System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]");
51     }
52 
53     private void reverseEachWord(StringBuilder sb) {
54         int start = 0;
55         int end = 1;
56         int n = sb.length();
57         while (start < n) {
58             while (end < n && sb.charAt(end) != ' ') {
59                 end++;
60             }
61             reverseString(sb, start, end - 1);
62             start = end + 1;
63             end = start + 1;
64         }
65     }
66 }

 

posted @ 2021-10-29 17:09  DidUStudy  阅读(24)  评论(0编辑  收藏  举报