反转字符串中的单词

LeetCode每日一题,557. Reverse Words In a String III

先看题目描述

大意就是给定一个字符串,里面有若干个被空格分开的单词,让我们将单词翻转,但单词顺序和空格不变

算法和思路

基本思路就是先将字符串根据空格切割,获得字符串数组,然后遍历里面每个字符串,将每个字符串翻转后添加到 res 后,同时添加一个空格,最后一个单词翻转后不用加空格到 res 后,最后返回 res即可

算法源码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public String reverseWords(String s) {
String[] ss = s.split(" ");
StringBuilder res = new StringBuilder();
for (int i = 0;i < ss.length - 1; i++) {
res.append(new StringBuilder(ss[i]).reverse() + " ");
}
res.append(new StringBuilder(ss[ss.length - 1]).reverse());
return res.toString();
}
}

后来看时间击败 94.865% 的代码,发现别人没用 java 内置的函数,使用了几个指针,再一个个遍历字符实现单词翻转,效率更高,下面是代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public String reverseWords(String s) {
int len = s.length();
char[] chars = s.toCharArray();
char[] res = new char[len];
int left = 0, right = 0, mem = 0;
int ptr = 0;
while (left < len && right < len) {
while (right < len && chars[right] != ' ') {
right++;
}
for (int i = right - 1; i >= left; i--) {
res[ptr++] = chars[i];
}
if (ptr < len) res[ptr++] = ' ';
left = right + 1;
right++;
}
return String.valueOf(res);
}
}