剑指 Offer 05. 替换空格

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

1
2
输入:s = "We are happy."
输出:"We%20are%20happy."

遍历添加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 遍历添加 时间复杂度O(N),空间复杂度O(N)
func replaceSpace(s string) string {
	b := make([]byte, 0)
	for i := 0; i < len(s); i++ {
		if s[i] == ' ' {
			b = append(b, []byte("%20")...)
		} else {
			b = append(b, s[i])
		}
	}
	return string(b)
}

原地修改

扩充然后逆序填入

其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后再从后向前进行操作。

 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
// 原地修改 时间复杂度O(N),空间复杂度O(1)
func replaceSpace(s string) string {
	b := []byte(s)
	length := len(b)
	spaceCount := 0
	// 计算空格数量
	for _, v := range b {
		if v == ' ' {
			spaceCount++
		}
	}
	// 扩展原有切片
	tmp := make([]byte, spaceCount*2)
	b = append(b, tmp...)
	i := length - 1 // 指向原来最后一位
	j := len(b) - 1 // 指向现在最后一位
	// 从后向前填充
	for i >= 0 {
		if b[i] != ' ' {
			b[j] = b[i]
			i--
			j--
		} else {
			b[j] = '0'
			b[j-1] = '2'
			b[j-2] = '%'
			i--
			j = j - 3
		}
	}
	return string(b)
}