【剑指Offer】05.替换空格JavaScript解法

题目描述

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

输入:s = "We are happy."
输出:"We%20are%20happy."

解答

解法一:创建新的字符串

var replaceSpace = function(s) {
    // 直接创建新的字符串
    var newString = '';
    for(var i=0;i<s.length;i++){
        if(s[i]==' '){
            newString = newString+'%20';
            continue;
        }
        newString = newString + s[i];
    }
    return newString;
};

这一解法非常容易想到,也非常简单。

另一种写法:

    var newString = '';
    var array = [];
    array = s.split(' '); // ['we','are','hanppy.']
    for(var i=0;i<array.length-1;i++){
        newString = newString+ array[i]+'%20';
    }
    newString = newString + array[i];
    return newString;

解法二:在原有的字符串s上进行替换,并保证输入的字符串后面有足够多的空余内存。

复杂度为o(n^2)

每发现一个空格,则将空格之后的字符统一向后移动两个字节。假设字符串的长度为n,则对每个空格字符都需要移动后面o(n)个字符,对于有o(n)个空格的字符串来说,需要的时间为o(n^2)。

var replaceSpace = function(s) {
    // 复杂度为o(n^2)的解法
    // 将字符串转换为字符数组
    var array = s.split('');
    var length = array.length;

    for(var i=0;i<array.length;i++){
        if(array[i]==' '){
            p1 = array.length-1;
            array.push('0');
            array.push('0');
            for(var j=array.length-1;j>i+2;j--){
                array[j] = array[p1];
                p1--;
            }
            // console.log(array[j]);
            array[j] = '0';
            // console.log(array[j]);
            array[--j] = '2';
            array[--j] = '%';
        }
    } 
    return array.join('');
}

复杂度为o(n):

首先遍历字符串,计算空格的个数,提前计算好替换后的空间。变量p1指向原字符串的末尾,变量p2指向替换后的字符串末尾。

接下来,逐个向前移动p1,并将指向的值复制到p2指向的位置,直到碰到空格为止。然后,在p2之前插入“%20”。

var replaceSpace = function(s) {
    var num=0;
    var length = s.length; //13
    // 遍历得到空格数目,每找到一个空格,在s后补两个0
    for(var i=0;i<s.length;i++){
        if(s[i]==' '){
            num++;
            s+='0';
            s+='0';
        }
    }
    var p1 = length-1;
    var p2 = s.length-1;
    var array = s.split('');
    while(p1<p2 && p1>=0){
        while(array[p1]!==' '){
            array[p2] = array[p1];
            p2--;
            p1--;     
        }
        array[p2] = '0';
        array[--p2] = '2';
        array[--p2] = '%';
        --p2;
        --p1;
    }
    return array.join('');
};

知识点总结

string.split(''):将字符串转换为字符数组

string.split(' '):将字符串按空格分隔成多个子串,并保存在数组中

array.join(''):将字符数组转换为字符串

array.join():将数组元素拼接成字符串,无参数则默认以逗号连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值