对应LeetCode上的题目:面试题05. 替换空格
题目描述:请实现一个函数,把字符串 s 中的每个空格替换成”%20”。
例:
| 12
 
 | 输入:s = "We are happy."输出:"We%20are%20happy."
 
 | 
题目描述
请实现一个函数,把字符串 s 中的每个空格替换成”%20”。
例:
| 12
 
 | 输入:s = "We are happy."输出:"We%20are%20happy."
 
 | 
解法一,正则表达式
字符串有一个 replace 方法,可以把字符串里面特定的字符转换成我们想要的字符
| 12
 3
 4
 5
 6
 
 | var replaceSpace = function(s) {
 if(!s) return
 
 return s.replace(/ /g, '%20')
 };
 
 | 
一句代码就搞定,这方法真香
解法二
使用字符串的分割 split 和 数组的分割 join
| 12
 3
 4
 5
 6
 
 | var replaceSpace = function(s) {
 if(!s) return
 
 return s.spilt(' ').join('%20')
 };
 
 | 
注意,虽然这种 api 是香,但是只能作为一种辅助的方法,面试官更多想考我们的算法能力和解题思路,这种只能用来当作题目的一种解法
解法三,双指针
遍历原字符串,统计空格和非空格字符个数,计算替换后的新字符的长度,准备两个指针,指针 i 指向原字符串,指针 j 指向新字符串
| 12
 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 ""
 }
 
 
 
 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)
 
 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("")
 }
 
 |