题目描述
请实现一个函数,把字符串中的每个空格替换成%20
。
例如:输入We are happy.
,则输出We%20are%20happy.
。
解题
正则替换
说到字符串的替换应该首先想到的就是这种方法吧~ 记得正则的末尾加上g
,否则只会替换首个命中的空格。
function replaceSpaceRegular(str: string) {
return str.replace(/ /g, '%20');
}
split & join
function replaceSpaceSplitJoin(str: string) {
return str.split(' ').join('%20');
}
reduce
在js的String
实例方法中其实并没有reduce
,不过我们可以找隔壁的Array
借来一用。
function replaceSpaceReduce(str: string) {
return Array.prototype.reduce.call(str, (result: string, current: string) => {
return result + (current === ' ' ? '%20' : current);
}, '');
}
插个题外话,这种方式其实不是很推荐,虽然可以实现题目所描述的功能,但由于String
类型在js中是不可变的,一旦String
的实例生成,其所有的属性都是只读的。无论是使用concat
还是+
操作符,都会生成一个新的字符串。
为了论证上述观点,我们可以做以下的尝试:
let str = 'abc';
str[0] = 'd';
console.log(str); // abc
Array.prototype.push.call(str, '1'); // Cannot assign to read only property 'length' of object '[object String]'
Array.prototype.reverse.call(str) // Cannot assign to read only property '0' of object '[object String]'
预先计算字符串长度
空格占用1个字符,而%20
占用3个字符,所以替换后的字符串一定比之前的长。我们可以通过以下的步骤完成空格的替换:
- 统计空格在被替换字符串中的数量并计算出替换后字符串的长度
- 使用索引
originIndex
和replaceIndex
来标记当前字符在源字符串和替换后字符串中的位置。 - 依次复制源字符串
originIndex
位置的字符到新字符串的replaceIndex
,若遇到空格则添加%20
到新字符串中;此时originIndex
+1,replaceIndex
+3。
注:前面说过由于js中的String
是不可变的,所以这里我们使用Array
来模拟String
function replaceSpace(str: string) {
// 统计空格字符数量
let spaceCount = 0;
for (let i = 0; i < str.length; ++i) {
if (str[i] === ' ') {
++spaceCount;
}
}
// 计算新字符串的长度
const arr = new Array(spaceCount * 2 + str.length);
let originIndex = 0;
let replaceIndex = 0;
while (originIndex < str.length) {
if (str[originIndex] === ' ') {
arr[replaceIndex++] = '%';
arr[replaceIndex++] = '2';
arr[replaceIndex++] = '0';
originIndex++;
} else {
arr[replaceIndex++] = str[originIndex++];
}
}
return arr.join('');
}
网友评论