題目描述
請實現(xiàn)一個函數(shù),把字符串中的每個空格替換成%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);
}, '');
}
插個題外話,這種方式其實不是很推薦,雖然可以實現(xiàn)題目所描述的功能,但由于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個字符,所以替換后的字符串一定比之前的長。我們可以通過以下的步驟完成空格的替換:
- 統(tǒng)計空格在被替換字符串中的數(shù)量并計算出替換后字符串的長度
- 使用索引
originIndex和replaceIndex來標記當前字符在源字符串和替換后字符串中的位置。 - 依次復制源字符串
originIndex位置的字符到新字符串的replaceIndex,若遇到空格則添加%20到新字符串中;此時originIndex+1,replaceIndex+3。
注:前面說過由于js中的String是不可變的,所以這里我們使用Array來模擬String
function replaceSpace(str: string) {
// 統(tǒng)計空格字符數(shù)量
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('');
}