File tree Expand file tree Collapse file tree 2 files changed +114
-0
lines changed
Expand file tree Collapse file tree 2 files changed +114
-0
lines changed Original file line number Diff line number Diff line change 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 )
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