剑指offer-替换空格 | JianLinker Blog

剑指offer-替换空格

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

We Are Happy

We%20Are%20Happy

如果不考虑在原来的字符串上替换的话, 那么我们直接再开一个数组,从前往后依次赋值

遇见空格,就填上%20, 否则就填当前字符。

但是这个肯定不是面试官期待的

那么怎么在原字符串上进行高效的替换呢?

实现思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

func replaceSpace(str []byte, length int) string {
count := 0
for i := 0; i < length -1; i++ {
count++
}
newlength := length + count*2
for l, nl := length-1;newlength-1; l > 0 && nl > 0 ;{
if str[l] == ' ' {
str[nl] = '0'
nl--
str[nl] = '2'
nl--
str[nl] = '%'
nl--
l--
} else {
str[nl] = str[l]
nl--
l--
}
}
}

测试

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
package main

import (
"testing"
"github.com/stretchr/testify/assert"
)

type para struct {
str []byte
length int
}

type ans struct {
res []byte
}

type question struct {
p para
a ans
}

func Test_OK(t *testing.T) {
ast := assert.New(t)

qs := []question{
question{
p: para{
str: []byte{'a',' ','b',' ','c','x','x','x','x'},
length: 5,
},
a: ans{
res: []byte{'a','%','2','0','b','%','2','0','c'},
},
},
}

for _, q := range qs {
a, p := q.a, q.p
replaceSpace(p.str, p.length)
ast.Equal(string(a.res), string(p.str), "输入:%v", p)
}
}
JianLinker wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!