Skip to content

Commit c6a13ba

Browse files
committed
GitBook: [master] 2 pages modified
1 parent 4a7611a commit c6a13ba

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* [剑指 Offer](docs/jzof/README.md)
99
* [OF3.数组中重复的数字](docs/jzof/of003.md)
1010
* [OF4. 二维数组中的查找](docs/jzof/of004.md)
11+
* [OF5. 替换空格](docs/jzof/of005.md)
1112
* [OF37.序列化二叉树](docs/jzof/of037.md)
1213
* [OF14-I.剪绳子](docs/jzof/of014-i.md)
1314
* [OF14-II.剪绳子](docs/jzof/of014-ii.md)

docs/jzof/of005.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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%20are%20happy."
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+

0 commit comments

Comments
 (0)