๐Ÿ“ฆ jtr109 / go-playground

๐Ÿ“„ lib.go ยท 44 lines
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)
}