剑指 Offer 05. 替换空格
题目描述
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
解法一 :遍历添加
/**
* @param {string} s
* @return {string}
*/
var replaceSpace = function(s) {
let res = ''
for(let char of s){
if(char == ' '){
res = res + '%20'
}else{
res = res + char
}
}
return res
};
解法二:利用原生 api
//repleace/replaceAll
var replaceSpace = function(s) {
return s.replace(/ /g, '%20')
};
var replaceSpace = function(s) {
return s.replaceAll(' ', '%20')
};
//split/join
var replaceSpace = function(s) {
return s.split(' ').join("%20");
};
解法三:原地修改
因为 JS 中字符串无法被修改,一旦给字符串变量重新赋值,就要花费时间和空间去重新新建一个字符串,从而增加了复杂度!
所以我们这里采用数组来进行操作,流程如下:
- 将字符串转换为数组,然后统计其中的空格数量。
- 根据空格数量和原有字符串有效字符长度,计算出刚好存放替换后的字符长度的数组。
- 创建两个指针,一个指数组末尾,一个指字符串有效位的末尾,实现原地修改。
值得注意的是:数组遍历,一定要从后往前遍历,避免从前往后,造成字符被修改,导致错误!
function replaceSpace( s ) {
let old = s.length
s = s.split('')
let space = 0
for(let c of s){
if(c === ' '){
space++
}
}
s.length += space*2
for(let i = old-1, j = s.length-1; i >= 0; i--, j--){
if(s[i] === ' '){
s[j-2] = '%'
s[j-1] = '2'
s[j] = '0'
j -= 2
}else{
s[j] = s[i]
}
}
return s.join('')
}