输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
方法一:字符串头插
把已经读取到的单词组 words 添加到当前单词 curr 的后面,先在每个单词后面都添加一个空格,最后在删除字符串最后面的一个空格
- 时间复杂度 O(n)
- 空间复杂度 O(n)
// 自己写的效率果然不行
// 执行用时:26 ms, 在所有 Java 提交中击败了5.41%的用户
// 内存消耗:39.1 MB, 在所有 Java 提交中击败了25.46%的用户
public String reverseWords(String s) {
String words = new String();
boolean first = true;
for (int i = 0; i < s.length(); i++) {
// 一次读取一个单词
String curr = new String();
while (i < s.length() && s.charAt(i) != ' ') {
curr = curr + Character.toString(s.charAt(i));
i++;
}
if (!curr.equals("")) {
curr = curr + " " + words;
words = new String(curr);
}
}
if (!words.equals("")) {
words = words.substring(0, words.length() - 1);
}
return words;
}
方法二:倒序双指针法
双指针 i, j 从后往前指向一个单词的首尾,然后再用 substring() 取出这个单词,在单词尾部添加一个 " ",再加入到结果集 StringBuilder 中
s.trim() 是真的好用,可以去除首尾的空格,方法一就可以简单很多
- 时间复杂度 O(n)
- 空间复杂度 O(n)
public String reverseWords(String s) {
s.trim(); // 删除首尾空格
int i = s.length() - 1, j = i;
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;
}
return res.toString().trim();
}