题目
给定一个字符串,逐个反转字符串中的每个单词
示例 1:
1
2
|
输入: "the sky is blue"
输出: "blue is sky the"
|
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解题思路
1,采取双指针方法, 去除多余的空格
3,有效字符串整体反转
4.反转以后, 再逐个反转每个单词
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
public static String reverseWords(String s) {
if (s == null) return s;
// cur 指针指向当前重组后的字符串当前的index
int cur = 0;
// len 代表重组后的字符串的有效长度
int len = 0;
char[] chars = s.toCharArray();
// 上一个是否是空格,如果是空格,则下次进入空格时 cur不加加
boolean prevIsSpace = true;
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c != ' '){
chars[cur ++] = chars[i];
prevIsSpace = false;
}else if (prevIsSpace == false){
chars[cur ++] = chars[i];
prevIsSpace = true;
}
}
// 算出有效长度
len = prevIsSpace ? cur - 1 : cur;
if (len <= 0) return "";
// 反转整体字符串
reverse(chars,0,len);
// 分别反转 每个单词
int prevSpaceIdx = -1;
for (int i = 0; i < len; i++) {
if (chars[i] != ' ') continue;
reverse(chars,prevSpaceIdx + 1,i);
prevSpaceIdx = i;
}
reverse(chars,prevSpaceIdx + 1,len);
return new String(chars,0,len);
}
// 反转[l,r) 左闭右开
public static void reverse(char[] chars, int l, int r){
r --;
while (l < r){
char tmp = chars[l];
chars[l++] = chars[r];
chars[r--] = tmp;
}
}
|