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// https://leetcode.com/problems/reverse-words-in-a-string/
package reversewordsinastring
func reverseWords(s string) string {
runes := []rune(s)
// distinct spaces
i := 0
j := 0
for j < len(runes) {
if runes[j] == ' ' {
j++
continue
}
if j > 0 && runes[j-1] == ' ' && i != 0 {
runes[i] = ' '
i++
}
runes[i] = runes[j]
i++
j++
}
runes = runes[:i]
// reverse rune by rune
for i, j := 0, len(runes)-1; i < j; {
runes[i], runes[j] = runes[j], runes[i]
i++
j--
}
for left, right := 0, 0; right < len(runes); {
for right < len(runes) && runes[right] != ' ' {
right++
}
for i, j := left, right-1; i < j; {
runes[i], runes[j] = runes[j], runes[i]
i++
j--
}
left = right + 1
right = left
}
return string(runes)
}