题目
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1: 输入: “the sky is blue” 输出: “blue is sky the”
示例 2: 输入: " hello world! " 输出: “world! hello” 解释:
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3: 输入: “a good example” 输出: “example good a” 解释:
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路
算法流程:
(1)倒序遍历字符串 s
,记录单词左右索引边界 i
, j
;
(2)每确定一个单词的边界( 即固定一个字母,当另一个指针走到空格说明是一个单词),则将其添加至单词列表 res
;
(3)最终,将单词列表拼接为字符串,并返回即可。
流程如下图所示:
java代码如下:
class Solution{
public String reverseWords(String s){
s = s.trim();//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) + " ");//添加单词,注意添加一个单词后不要漏掉空格,因为substring是左闭右开,此时i指向的是单词前一位的空格,所以范围是(i+1,j+1)
while(i >= 0 && s.charAt(i) == ' ') i--;//如果是空格,则跳过单词间的空格
j = i;//j指向下个单词的尾字符,继续进行添加
}
return res.toString().trim();//转化成字符串返回,因为最后一个单词末尾会多一个空格
}
}