第一种方法是使用Java的内置方法,非常巧妙,代码如下:
public class Solution {
public String reverseWords(String s) {
if(s == null || s.length() == 0) return s;
String[] words = s.trim().split(" +");
Collections.reverse(Arrays.asList(words));
return String.join(" ", words);
}
}
第二种方法不使用Java内置方法,这种方法总的来说分三步:第一步是翻转整个array,第二步是翻转array中的所有word,第三步是清除array中的空格。大思路确定之后,我们可以思考怎样实现这三步。
第一步的话,我们可以另外写一个reverse array的函数实现,着是一个基础的方法,要记住。
第二步的话,我们使用两个指针逐个扫描char[] array,i指针跳过空格或者i < j,j指针跳过字母或者j < i,然后reverse(array, i, j - 1),这样就反转了其中的一个单词。在i < n的条件下重复上面的过程,这样我们就翻转了所有的单词。
第三步我们同样使用两个指针,j指针用于跳过空格,而i指针开始的时候指向开头,用于将j指向的字母移动到i的位置,这个方法有些繁杂,要考虑多种情况,需要多看看多体会。
整体的代码如下:
public class Solution {
public String reverseWords(String s) {
if(s == null || s.length() == 0) return s;
char[] arr = s.toCharArray();
int n = arr.length;
// Step 1. Reverse whole array
reverse(arr, 0, n - 1);
// Step 2. Reverse each word
reverseEachWord(arr, n);
// Step 3. Clean spaces
return cleanSpaces(arr, n);
}
private String cleanSpaces(char[] arr, int n){
int i = 0;
int j = 0;
while(j < n){
while(j < n && arr[j] == ' ') j++;
while(j < n && arr[j] != ' ') arr[i++] = arr[j++];
while(j < n && arr[j] == ' ') j++;
if(j < n) arr[i++] = ' ';
}
return new String(arr).substring(0, i);
}
private void reverseEachWord(char[] arr, int n){
int i = 0; // pointer to jump spaces
int j = 0; // pointer to jump non-spaces
while(i < n){
while(i < j || (i < n && arr[i] == ' ')) i++; // jump spaces
while(j < i || (j < n && arr[j] != ' ')) j++; // jump non-spaces
reverse(arr, i, j - 1); // reverse word
}
}
private void reverse(char[] arr, int i, int j){
while(i < j){
char temp = arr[i];
arr[i++] = arr[j];
arr[j--] = temp;
}
}
}
知识点:
1. 这是一道非常经典的String类型的题目,方法二的处理String的办法很值得看,这道关于String的题目要多看几遍,多写几遍,多思考几遍
2. 这也是一道大翻转类型的题目,要对整体进行翻转,然后再对个体进行翻转,这种思想使用比较广泛,要多多体会