发布于 

剑指 Offer.58-I.翻转单词顺序

剑指 Offer.58-I.翻转单词顺序

题目链接

<剑指 Offer 58 - I. 翻转单词顺序 - 力扣(LeetCode) (leetcode-cn.com)>

问题描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”

个人想法

反向遍历目标字符串,当遇到空格时,向结果字符串中写入

时间复杂度:$O(N)$

空间复杂度:$ O(N)$ 由于Java中的字符串是不可变对象,故无法避免$O(N)$的时间开销

官方解法

首先去除首尾的空格,倒序遍历字符串,当确定单词边界后,使用s.substring()函数将字符串切割,后直接添加入结果串中,在返回前,需要通过s.trim()函数去除首尾的空格

时间复杂度:$O(N)$

空间复杂度:$ O(N)$

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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(); // 转化为字符串并返回
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @John Doe 创建,使用 Stellar 作为主题。