美文网首页
【剑指Offer for JS】替换空格

【剑指Offer for JS】替换空格

作者: 灵活的胖墩 | 来源:发表于2020-07-09 20:59 被阅读0次

题目描述

请实现一个函数,把字符串中的每个空格替换成%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个字符,所以替换后的字符串一定比之前的长。我们可以通过以下的步骤完成空格的替换:

  1. 统计空格在被替换字符串中的数量并计算出替换后字符串的长度
  2. 使用索引originIndexreplaceIndex来标记当前字符在源字符串和替换后字符串中的位置。
  3. 依次复制源字符串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('');
}

相关文章

网友评论

      本文标题:【剑指Offer for JS】替换空格

      本文链接:https://www.haomeiwen.com/subject/wxqecktx.html