diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 13938fd9..d9ecfc12 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -212,79 +212,76 @@ public: Java: -```java + +```Java class Solution { - public String reverseWords(String s) { - char[] chars = s.toCharArray(); - // 1.双指针去除空格 - // 去除头尾空格 - int head = 0; - while (chars[head] == ' ') { - head ++; - } - int tail = chars.length - 1; - while (chars[tail] == ' ') { - tail --; - } + /** + * 不使用Java内置方法实现 + *
+ * 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(); + } - // 去除中间空格 - int p1 = head; - int p2 = head + 1; - while (p2 <= tail) { - if (chars[p2 -1] == ' ' && chars[p2] == ' ') { - p2 ++; - continue; - } - chars[p1 + 1] = chars[p2]; - p1 ++; - p2 ++; - } + 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; + } - tail = p1; + /** + * 反转字符串指定区间[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 + "]"); + } - // 2.双指针翻转整个字符串 - chars = reverse(chars, head, tail); - - // 3.双指针翻转每个单词 - p1 = head; - p2 = head; - - for (int i = head; i <= tail;) { - int add = 0; - while (i + add <= tail && chars[i + add] != ' ') { - add ++; - } - - if (i + add != tail) { - reverse(chars, i, i + add - 1); - i += add + 1; - } else { - reverse(chars, i, tail); - i = tail + 1; - } - } - - return new String(chars, head, tail - head + 1); - } - - char[] reverse(char[] chars, int begin, int end) { - int p1 = begin; - int p2 = end; - - while (p1 < p2) { - chars[p1] ^= chars[p2]; - chars[p2] ^= chars[p1]; - chars[p1] ^= chars[p2]; - - p1 ++; - p2 --; - } - return chars; - } + 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; + } + } } ``` - Python: