剑指 Offer 58 - I. 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. "
,则输出"student. a am I"
。
示例 1:
输入: ” the sky is blue”
输出: ” blue is sky the”
示例 2:
输入: “[HTML_REMOVED]hello world![HTML_REMOVED] “
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good[HTML_REMOVED]example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
注意:
本题与主站 151 题相同:https://leetcode-cn.com/problems/reverse-words-in-a-string/
注意:
此题对比原题有改动
解题思路
按空格切分字符串得到单词列表,然后倒序遍历
单词列表,并将单词逐个添加至 StringBuilder
,遇到空单词(""
)时跳过。
本题要注意的一个点是:在Java
中以空格为分割符完成字符串分割后,若两单词间有$x > 1$ 个空格,则在单词列表 strs
中,此两单词间会多出$x - 1$个 “空单词” (即"")
。
Java代码
class Solution {
public String reverseWords(String s) {
if(s == null) return "";
s = s.trim();//去除两边空格
String[] strs = s.split(" ");//按空格切分字符串
StringBuilder sb = new StringBuilder();
for(int i = strs.length - 1; i >= 0;i--){
if(strs[i].equals("")) continue;//过滤空串
sb.append(strs[i]).append(" ");
}
return sb.toString().trim();//转为字符串并去除最后多余的那个空格
}
}