給你一個字符串 s
,請你反轉字符串中 單詞 的順序。
單詞 是由非空格字符組成的字符串。s
中使用至少一個空格將字符串中的 單詞 分隔開。
返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。
注意:輸入字符串 s
中可能會存在前導空格、尾隨空格或者單詞間的多個空格。返回的結果字符串中,單詞間應當僅用單個空格分隔,且不包含任何額外的空格。
示例 1:
輸入:s = "the sky is blue" 輸出:"blue is sky the"
示例 2:
輸入:s = " hello world " 輸出:"world hello" 解釋:反轉后的字符串中不能存在前導空格和尾隨空格。
示例 3:
輸入:s = "a good ? example" 輸出:"example good a" 解釋:如果兩個單詞間有多余的空格,反轉后的字符串需要將單詞間的空格減少到僅有一個。
提示:
-
1 <= s.length <= 104
-
s
包含英文大小寫字母、數字和空格' '
-
s
中 至少存在一個 單詞
解:
class Solution {/*** 不使用Java內置方法實現* <p>* 1.去除首尾以及中間多余空格* 2.反轉整個字符串* 3.反轉各個單詞*/public String reverseWords(String s) {// System.out.println("ReverseWords.reverseWords2() called with: s = [" + s + "]");// 1.去除首尾以及中間多余空格StringBuilder sb = removeSpace(s);// 2.反轉整個字符串reverseString(sb, 0, sb.length() - 1);// 3.反轉各個單詞reverseEachWord(sb);return sb.toString();}
?private StringBuilder removeSpace(String s) {// System.out.println("ReverseWords.removeSpace() called with: s = [" + s + "]");int start = 0;int end = s.length() - 1;while (s.charAt(start) == ' ') start++;while (s.charAt(end) == ' ') end--;StringBuilder sb = new StringBuilder();while (start <= end) {char c = s.charAt(start);if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}start++;}// System.out.println("ReverseWords.removeSpace returned: sb = [" + sb + "]");return sb;}
?/*** 反轉字符串指定區間[start, end]的字符*/public void reverseString(StringBuilder sb, int start, int end) {// System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]");while (start < end) {char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start++;end--;}// System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]");}
?private void reverseEachWord(StringBuilder sb) {int start = 0;int end = 1;int n = sb.length();while (start < n) {while (end < n && sb.charAt(end) != ' ') {end++;}reverseString(sb, start, end - 1);start = end + 1;end = start + 1;}}
}