File tree 2 files changed +114
-0
lines changed 2 files changed +114
-0
lines changed Original file line number Diff line number Diff line change 8
8
* [ 剑指 Offer] ( docs/jzof/README.md )
9
9
* [ OF3.数组中重复的数字] ( docs/jzof/of003.md )
10
10
* [ OF4. 二维数组中的查找] ( docs/jzof/of004.md )
11
+ * [ OF5. 替换空格] ( docs/jzof/of005.md )
11
12
* [ OF37.序列化二叉树] ( docs/jzof/of037.md )
12
13
* [ OF14-I.剪绳子] ( docs/jzof/of014-i.md )
13
14
* [ OF14-II.剪绳子] ( docs/jzof/of014-ii.md )
Original file line number Diff line number Diff line change
1
+ ---
2
+ description : 剑指 Offer 05. 替换空格
3
+ ---
4
+
5
+ # OF5. 替换空格
6
+
7
+ ## 题目描述
8
+
9
+ [ 题目地址] ( https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/ )
10
+
11
+ 请实现一个函数,把字符串 ` s ` 中的每个空格替换成"%20"。
12
+
13
+ ### ** 示例 1:**
14
+
15
+ ``` go
16
+ 输入:s = " We are happy."
17
+ 输出:" We%20a re%20h appy."
18
+ ```
19
+
20
+ ### ** 限制:**
21
+
22
+ ``` go
23
+ 0 <= s 的长度 <= 10000
24
+ ```
25
+
26
+ ## 题解
27
+
28
+ ### 思路1 : 遍历添加
29
+
30
+ Python 和 Golang 的字符串都是不是修改的,不考虑内存的话可以开个数组方便操作。
31
+
32
+ ** 算法流程:**
33
+
34
+ 1 . 初始化一个数组
35
+ 2 . 循环遍历字符串
36
+ 1 . 如果 v = 空格:后缀添加 ` %20 `
37
+ 2 . 如果 v != 空格:后缀添加 ` v `
38
+ 3 . 数组转化为字符串
39
+
40
+ ** 复杂度分析:**
41
+
42
+ * ** 时间复杂度** $$ O(N) $$ ** :** 遍历字符串 ` s ` 一遍。
43
+ * ** 空间复杂度** $$ O(N) $$ ** :** 额外创建字符数组,长度为 ` s ` 的长度的 3 倍
44
+
45
+ #### 代码
46
+
47
+ {% tabs %}
48
+ {% tab title="Python3" %}
49
+ ``` go
50
+ class Solution :
51
+ def replaceSpace (self, s: str) -> str:
52
+ ans = []
53
+ for v in s:
54
+ if v != ' ' : ans.append (v)
55
+ else :
56
+ ans.append (" % 20" )
57
+ return " " .join (ans)
58
+ ```
59
+ {% endtab %}
60
+ {% endtabs %}
61
+
62
+ ### 思路2 : 原地置换
63
+
64
+ 由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。
65
+
66
+ ** 算法流程:**
67
+
68
+ 1 . 获得 s 的长度 length
69
+ 2 . 创建字符数组 ans,其长度为 length \* 3
70
+ 3 . 初始化 size 为 0,size 表示替换后的字符串的长度
71
+ 4 . 从左到右遍历字符串 s
72
+ 1 . 获得 s 的当前字符 c
73
+ 2 . 如果字符 c 是空格,则令 array\[ size\] = '%',array\[ size + 1\] = '2',array\[ size + 2\] = '0',并将 size 的值加 3
74
+ 3 . 如果字符 c 不是空格,则令 array\[ size\] = c,并将 size 的值加 1
75
+ 5 . 遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串
76
+
77
+ ** 复杂度分析:**
78
+
79
+ * ** 时间复杂度** $$ O(N) $$ ** :** 遍历字符串 ` s ` 一遍。
80
+ * ** 空间复杂度** $$ O(N) $$ ** :** 额外创建字符数组,长度为 ` s ` 的长度的 3 倍
81
+
82
+ #### 代码
83
+
84
+ {% tabs %}
85
+ {% tab title="Go" %}
86
+ ``` go
87
+ func replaceSpace (s string ) string {
88
+ result := make ([]rune, len (s)*3 )
89
+
90
+ i := 0
91
+ for _ , v := range s {
92
+ if v != ' ' {
93
+ result[i] = v
94
+ i++
95
+ } else {
96
+ result[i] = ' %'
97
+ result[i+1 ] = ' 2'
98
+ result[i+2 ] = ' 0'
99
+ i += 3
100
+ }
101
+ }
102
+ return string (result)[:i]
103
+ }
104
+ ```
105
+ {% endtab %}
106
+ {% endtabs %}
107
+
108
+ ###
109
+
110
+ ## 总结
111
+
112
+ 如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 算法 题解:[ awesome-golang-algorithm] ( https://github.com/kylesliu/awesome-golang-algorithm )
113
+
You can’t perform that action at this time.
0 commit comments