【劍指Offer for JS】替換空格

題目描述

請實現(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個字符,所以替換后的字符串一定比之前的長。我們可以通過以下的步驟完成空格的替換:

  1. 統(tǒng)計空格在被替換字符串中的數(shù)量并計算出替換后字符串的長度
  2. 使用索引originIndexreplaceIndex來標記當前字符在源字符串和替換后字符串中的位置。
  3. 依次復制源字符串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('');
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容