题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
代码
class Solution {
public String reverseWords(String s) {
if(s == null) return null;
char[] a = s.toCharArray();
int n = a.length;
reverse(a, 0 , n - 1);
reverseWords(a, n);
return cleanSpaces(a, n);
}
private void reverse(char[] a, int i, int j){
while(i < j){
char t = a[i];
a[i++] = a[j];
a[j--] = t;
}
}
void reverseWords(char[] a, int n){
int i = 0, j = 0;
while(i < n){
while(i < j || i < n && a[i] == ' ') i++;
while(j < i || j < n && a[j] != ' ') j++;
reverse(a, i, j - 1);
}
}
String cleanSpaces(char[] a, int n){
int i = 0, j = 0;
while(j < n){
while(j < n && a[j] == ' ') j++;
while(j < n && a[j] != ' ') a[i++] = a[j++];
while(j < n && a[j] == ' ') j++;
if(j < n) a[i++] = ' ';
}
return new String(a).substring(0, i);
}
}