剑指OFFER----5、替换空格(js实现)

题目


官方解法

/**
 * @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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值