双指针
class Solution {
public String reverseWords(String s) {
StringBuilder str = new StringBuilder();
int left = 0;
int right = s.length() - 1;
/**
* 去掉字符串前后的空格
*/
while (left <= s.length() - 1 && s.charAt(left) == ' '){
left++;
}
while (right >= 0 && s.charAt(right) == ' '){
right--;
}
/**
* 去掉字符串中间多余的空格
*/
for (int i = left; i <= right; i++) {
char c = s.charAt(i);
/**
* 不是空格直接添加
* 如果是空格但是str最后一个元素不是空格,则可以添加
*/
if (c != ' '){
str.append(c);
}
else if (c == ' ' && str.charAt(str.length() - 1) != ' '){
str.append(c);
}
}
/**
* 反转字符串
*/
reverse(str, 0, str.length() - 1);
/**
* 反转单词
*/
left = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' '){
reverse(str, left, i - 1);
left = i + 1;
}
/**
* 最后一个单词后面没有空格无法判断,因此单独判断
*/
else if (i == str.length() - 1){
reverse(str, left, i);
}
}
return str.toString();
}
/**
* 定义反转字符串方法
*/
public void reverse(StringBuilder str, int left, int right){
while (left < right){
char temp;
temp = str.charAt(left);
/**
* setCharAt()方法修改StringBuilder对象值
*/
str.setCharAt(left, str.charAt(right));
str.setCharAt(right, temp);
left++;
right--;
}
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
库函数
import java.util.Arrays;
import java.util.Collections;
class Solution {
public String reverseWords(String s) {
/**
* trim()方法去除字符串前后空格
*/
String str = s.trim();
/**
* split()方法根据分隔符分割字符串为字符串数组,存在多个空格用" +"
*/
String[] strs = str.split(" +");
/**
* 字符串数组转为列表,再用Collections.reverse()方法反转列表
*/
Collections.reverse(Arrays.asList(strs));
/**
* String.join()方法根据指定分隔符连接,形成新的字符串
*/
return String.join(" ", strs);
}
}
https://leetcode-cn.com/problems/reverse-words-in-a-string/