字符串--翻转字符串里的单词

44 阅读1分钟

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

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

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

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

代码:

package String;

public class ReverseStringWord {
    public static String reverseStringWord(String str) {
        // 去除首位以及中间多余空格
        StringBuilder sb = removeSpaces(str);
        // 反转整个字符串
        reverse(sb, 0, sb.length() - 1);
        // 反转各个单词
        reverseWord(sb);
        return sb.toString();
    }




    public static void reverseWord(StringBuilder sb) {
        int start = 0;
        for (int i = 0; i < sb.length(); i++) {
            int j = i;
            while (j < sb.length() && sb.charAt(j) != ' ') {
                j++;
            }
            reverse(sb, i, j - 1);
            i =j;
        }

    }

    public static void reverse(StringBuilder sb, int i, int j) {
        while (i < j) {
           char tmp = sb.charAt(i);
           sb.setCharAt(i, sb.charAt(j));
           sb.setCharAt(j, tmp);
           i++;
           j--;
        }
    }

    public static StringBuilder removeSpaces(String s) {
        int left = 0;
        int right = s.length() - 1;
        while (s.charAt(left) == ' ') {
            left++;
        }

        while (s.charAt(right) == ' ') {
            right--;
        }

        StringBuilder sb = new StringBuilder();
        while (left <= right) {
            if (s.charAt(left) != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(s.charAt(left));
            }
            left++;
        }
        return sb;
    }

    public static void main(String[] args) {
        String str = "  hello  world!  ";
        System.out.println(reverseStringWord(str));
    }
}