剑指Offer-Javascript版-替换空格

对应LeetCode上的题目:面试题05. 替换空格

题目描述:请实现一个函数,把字符串 s 中的每个空格替换成”%20”。

例:

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

题目描述

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

例:

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

解法一,正则表达式

字符串有一个 replace 方法,可以把字符串里面特定的字符转换成我们想要的字符

1
2
3
4
5
6

var replaceSpace = function(s) {
if(!s) return

return s.replace(/ /g, '%20')
};

一句代码就搞定,这方法真香

解法二

使用字符串的分割 split 和 数组的分割 join

1
2
3
4
5
6

var replaceSpace = function(s) {
if(!s) return

return s.spilt(' ').join('%20')
};

注意,虽然这种 api 是香,但是只能作为一种辅助的方法,面试官更多想考我们的算法能力和解题思路,这种只能用来当作题目的一种解法

解法三,双指针

遍历原字符串,统计空格和非空格字符个数,计算替换后的新字符的长度,准备两个指针,指针 i 指向原字符串,指针 j 指向新字符串

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

var replaceSpace = function(s) {
if(!s || !s.length) {
return ""
}

// emptyNum 空格的个数
// chNum 非空字符的个数
let emptyNum = 0, chNum = 0;

for(let i = 0, len = s.length; i < len; i++) {
if(s[i] === ' ') {
++emptyNum
} else {
++chNum
}
}

const length = emptyNum * 2 + chNum
const chs = new Array(length)
// i 是新字符串的下标,j是源字符串的下标
for(let i = 0, j = 0; j < s.length; ++j) {
if(s[j] === " ") {
chs[i++] = "%"
chs[i++] = "2"
chs[i++] = "0"
} else {
chs[i++] = s[j]
}
}

return chs.join("")
}
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×