题目
- 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy。则经过替换之后的字符串为We%20Are%20Happy。
- leetcode链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/
官方解法
/**
* @param {string} s
* @return {string}
* 官方解法
*/
var replaceSpace = function(s) {
const newArrayLen = s.split('').reduce((count, letter) => {
return count + (letter === ' ' ? 3 : 1)
}, 0)
const newArray = new Array(newArrayLen).fill('')
let newEnd = newArray.length - 1
let oldEnd = s.length - 1
while (newEnd > oldEnd) {
if (s[oldEnd] === ' ') {
newArray[newEnd--] = '0'
newArray[newEnd--] = '2'
newArray[newEnd--] = '%'
} else {
newArray[newEnd--] = s[oldEnd]
}
oldEnd--
}
while (newEnd >= 0) {
newArray[newEnd--] = s[oldEnd--]
}
return newArray.join('')
};
解法二:逐位判断
/**
* @param {string} s
* @return {string}
* 直接拼接
*/
var replaceSpace = function(s) {
let resultStr = ''
let idx = 0
for (let i = 0; i < s.length; i++) {
if (s[i] === ' ') {
resultStr += '%20'
} else {
resultStr += s[i]
}
}
return resultStr
};
解法三:正则
var replaceSpace = function(s) {
return s.replace(/\s/g, '%20');
}
解法四:自己实现replaceAll+subString
var replaceSpace = function(s) {
return replaceAll(s, ' ', '%20')
}
function subString (str, i, j) {
let result = ''
for (i; i < j; i++) {
result += str[i]
}
return result
}
function replaceAll(str, before, after) {
if (before.length > str.length) {
return str
}
let searchLength = before.length
let result = ''
for (let i = 0; i < str.length; i++) {
// 匹配到第一个字符
if (str[i] === before[0]) {
// 看before长度是否长于剩下的长度
if (i > str.length - before.length) {
break
// 足够长
} else {
let compareStr = subString(str, i, i + searchLength)
if (compareStr === before) {
let front = subString(str, 0, i)
let end = subString(str, i + searchLength, str.length)
str = front + after + end
}
}
}
}
return str
}