二分查找你学废了吗?快来看看这道题如何使用二分查找解决吧!
LeetCode链接:151. 反转字符串中的单词
1.题目描述
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
1 2
| 输入:s = "the sky is blue" 输出:"blue is sky the"
|
示例 2:
1 2 3
| 输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
|
示例 3:
1 2 3
| 输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
|
提示:
- $1 <= s.length <= 10^4$
s
包含英文大小写字母、数字和空格 ' '
s
中 至少存在一个 单词
2.题解
思路:
- 步骤1:去除字符串两端的空格
- 步骤2:反转字符串
- 步骤3:反转单词
方法1使用内置函数
方法2三个步骤的内置函数均是单独写的
方法3步骤2和步骤3可以通过双指针合并
2.1 内置函数
2.1.1 写法1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public String reverseWords(String s) { s = s.trim(); List<String> wordList = Arrays.asList(s.split("\\s+")); Collections.reverse(wordList); return String.join(" ", wordList); } }
|
2.1.2 写法2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public String reverseWords(String s) { String[] words = s.split(" +"); StringBuilder sb = new StringBuilder(); for (int i = words.length - 1; i >= 0; i--) { if (words[i].isEmpty()) continue; sb.append(words[i]).append(" "); } return sb.toString().trim(); } }
|
2.1.3 写法3
1 2 3 4 5 6 7 8
| class Solution { public String reverseWords(String s) { return Arrays.stream(s.trim().split(" +")) .filter(word -> !word.isEmpty()) .collect(Collectors.joining(" ", "", "")); } }
|
s.trim()
:
split(" +")
:
stream()
:
filter(word -> !word.isEmpty())
:
collect(Collectors.joining(" ", "", ""))
:
- 使用
Collectors.joining
将流中的单词连接成一个字符串,以空格分隔。
2.2 自行编写对应的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class Solution { public String reverseWords(String s) { char[] chs = trimSpaces(s);
reverse(chs, 0, chs.length - 1);
reverseEachWord(chs);
return new String(chs); }
public char[] trimSpaces(String s) { StringBuilder sb = new StringBuilder(); int left = 0, right = s.length() - 1;
while (left <= right && s.charAt(left) == ' ') left++; while (left <= right && s.charAt(right) == ' ') right--;
while (left <= right) { char c = s.charAt(left); if (c != ' ' || (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ')) { sb.append(c); } left++; }
return sb.toString().toCharArray(); }
public void reverse(char[] chs, int begin, int end) { while (begin < end) { char temp = chs[end]; chs[end--] = chs[begin]; chs[begin++] = temp; } }
public void reverseEachWord(char[] chs) { int start = 0, end = 0; while (start < chs.length) { while (end < chs.length && chs[end] != ' ') end++; reverse(chs, start, end - 1); start = end + 1; end++; } } }
|
2.3 双指针
2.3.1 写法1-自己写函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class Solution { public String reverseWords(String s) { s = trimSpaces(s); StringBuilder sb = new StringBuilder(); int end = s.length(); int begin = end - 1;
while (begin >= 0) { while (begin >= 0 && s.charAt(begin) != ' ') begin--; sb.append(s.substring(begin + 1, end)); if (begin > 0) sb.append(' '); end = begin; begin--; } return sb.toString(); }
public String trimSpaces(String s) { StringBuilder sb = new StringBuilder(); int left = 0, right = s.length() - 1; while (left <= right && s.charAt(left) == ' ') left++; while (left <= right && s.charAt(right) == ' ') right--; while (left <= right) { char c = s.charAt(left); if (c != ' ' || (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ')) { sb.append(c); } left++; } return sb.toString(); } }
|
2.3.2 写法2-内置函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public String reverseWords(String s) { s = s.trim(); StringBuilder sb = new StringBuilder(); int end = s.length() - 1; int begin = end;
while (begin >= 0) { while (begin >= 0 && s.charAt(begin) != ' ') begin--; sb.append(s.substring(begin + 1, end + 1)); if (begin > 0) sb.append(' '); while (begin >= 0 && s.charAt(begin) == ' ') begin--; end = begin; }
return sb.toString(); } }
|