题目描述:
解法1:
这种解法是使用截取字符串的办法。首先我们把头尾空格去掉,使用分割函数根据空格,把不是空格的内容分割出来。然后我们从分割数组的底部遍历,每遍历的一个元素,就添加到字符串缓冲区对象中,同时在后面加空格分隔,但是因为字符串最后是没有空格的,所以添加空格时要避免这种情况。最后把字符缓冲区对象转换成字符串即可。
class Solution {
public String reverseWords(String s) {
String[] str = s.trim().split(" ");
StringBuilder sb = new StringBuilder();
for(int i = str.length - 1; i >= 0; i--){
if(!str[i].isEmpty()){
sb.append(str[i]);
if(i != 0)sb.append(" ");
}
}
return sb.toString();
}
}
解法2:
这种解法是通过双指针的方法去解决。定义两个指针i,j,它们的初始位置都是在字符串的尾部,因为题目要求要翻转单词。然后i 向前移动,只要碰到的不是空格就继续往前移,碰到空格就停下,此时i 的位置是空格,i+1到j 的范围里是单词,我们把单词加入到字符串缓冲区对象中,同时在后面添加一个空格。然后把i++,j=i。最后把字符串缓冲区对象转换为字符串即可。
class Solution {
public String reverseWords(String s) {
s = s.trim(); // 删除首尾空格
int j = s.length() - 1, i = j;
StringBuilder res = new StringBuilder();
while(i >= 0) {
while(i >= 0 && s.charAt(i) != ' ') i--; // 搜索首个空格
res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
while(i >= 0 && s.charAt(i) == ' ') i--; // 跳过单词间空格
j = i; // j 指向下个单词的尾字符
}
return res.toString().trim(); // 转化为字符串并返回
}
}