首页 > 试题广场 >

替换空格

[编程题]替换空格
  • 热度指数:147958 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请实现一个函数,将一个字符串s中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

数据范围:。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。

示例1

输入

"We Are Happy"

输出

"We%20Are%20Happy"
示例2

输入

" "

输出

"%20"
推荐
使用JavaScript实现:
方法一:暴力破解
function replaceSpace( s ) {
    let result = '';
    for(let i = 0;i < s.length;i++) {
        if(s[i] === ' ') {
            result += '%20';
        } else {
            result += s[i];
        }
    }
    return result;
}
方法二:使用字符串的replace方法,将正则对象作为参数传入replace方法
function replaceSpace( s ) {
    let regx = new RegExp(' ','g');
    return s.replace(regx,'%20');
}
方法三:将字符串以空格作为分隔符使用split()转成数组,然后对数组使用join()方法
function replaceSpace( s ) {
    return s.split(' ').join('%20');
}
方法四:将字符串使用扩展运算符转成数组,然后使用数组的map方法
function replaceSpace( s ) {
    let arr = [...s].map(item => {
        return item === ' ' ? '%20' : item;
    });
    return arr.join('');
}
编辑于 2021-07-06 10:36:50 回复(3)
public class Solution {

    // 拼接法
    // 时间复杂度: O(n)
    // 空间复杂度: O(n)
    public String replaceSpace(String s) {
        if (s == null || s.isEmpty()) {
            return "";
        }

        char ch;
        StringBuilder sb = new StringBuilder(s.length() * 3);
        for (int i = 0, n = s.length(); i < n; i++) {
            ch = s.charAt(i);
            if (ch == ' ') {
                sb.append("%20");
            } else {
                sb.append(ch);
            }
        }
        return sb.toString();
    }
    
}
public class Solution {

    // 双指针法
    // 时间复杂度: O(n)
    // 空间复杂度: O(1)
    public String replaceSpace(StringBuilder s) {
        if (s == null) {
            return "";
        }
        // 计算空格个数
        int cnt = 0;
        for (int i = 0, n = s.length(); i < n; i++) {
            if (s.charAt(i) == ' ') {
                cnt++;
            }
        }
        // 确保容量足够
        int oldLength = s.length();
        int newLength = s.length() + cnt * 2;
        s.setLength(newLength);
        // 从后往前遍历
        char ch;
        int i = oldLength - 1, j = newLength - 1;
        while (i >= 0) {
            ch = s.charAt(i);
            if (ch == ' ') {
                s.setCharAt(j, '0');
                s.setCharAt(j - 1, '2');
                s.setCharAt(j - 2, '%');
                j = j - 3;
            } else {
                s.setCharAt(j, ch);
                j--;
            }
            i--;
        }
        // 返回结果
        return s.toString();
    }

}


发表于 2021-08-04 10:32:37 回复(0)
这里可以遍历字符串的每一位上的字符,当不是空格的时候我们保留他,当是空格的时候我们保存"%20",这里注意我们使用StringBuilder来一步步拼接字符串,而不使用String和“+”来拼接(底层每次都会创建StringBuilder),更加直接高效一点。

而且我们在遍历的时候直接使用s.charAt[i]来获取本位置上的元素,这操作的时间复杂度是O(1),直接返回底层数组索引位置上的值,而不是将字符串先转成array,string.toCharArray();底层会复制数组,空间开辟O(n),浪费空间。

最后将StringBuilder.toString()返回即可。
import java.util.*;

public class Solution {
    public String replaceSpace (String s) {
        //如果本来就是空字符串那我们返回就好。
        if(s==null || s.length()==0) return s;
        //使用StringBuilder在遍历过程中构建新的字符串。
        StringBuilder builder = new StringBuilder();
        char blank = ' ';
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)!=blank)
                builder.append(s.charAt(i));
            else
                builder.append("%20");
        }
        return builder.toString();
    }
}


发表于 2021-08-05 11:06:57 回复(1)
   public string replaceSpace (string s) {
        return s.Replace(" ","%20");
    }

发表于 2021-05-21 15:16:47 回复(0)
string replaceSpace(string s) 
{
    // write code here
    string a;
    for(auto& ch:s)
    {
        if(ch==' ') a.append("%20");
        else a+=ch;            
    }        
    return a;
}

发表于 2021-03-29 13:49:09 回复(0)
function replaceSpace( s ) {
    // write code here
        return s.replace(/\s/g,'%20');
}
用正则表达式来处理了一下

发表于 2021-03-16 20:47:17 回复(0)
先把字符串遍历放到字符串数组中
在查找空格填充“%20”
最后遍历输出新字符串
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) {
        // write code here
        int n = s.length();
        string s1[n];
        string s2;
        for (int i = 0; i < n; i++) {
            s1[i] = s[i];
        }
        for (int i = 0; i < n; i++) {
            if (s1[i] == " ") {
                s1[i] = "%20";
            }
        }
        for (int i = 0; i < n; i++) {
            s2 = s2 + s1[i];
        }
        return s2;
    }
};


发表于 2021-08-09 16:57:08 回复(0)
python一行代码即可:
return s.replace(" ", "%20")
发表于 2021-03-02 11:21:10 回复(6)
这题比较简单,不需要在原字符串上进行更改,直接新建一个string,判断一下即可
class Solution {
public:
    string replaceSpace(string s) {
        string res;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
                res+=s[i];
            else
                res+="%20";
        }
        return res;
    }
};
当然,有时候熟悉应用C++ stl也是一个不错的选择(狗头)

 for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')
                s.replace(i, 1, "%20");//从i位置开始的1个字符替换为%20
        }
        return s;


编辑于 2021-02-26 11:00:01 回复(2)
分享一个C的吧。
char* replaceSpace(char* s ) {
    // write code here
    char* ret_char = (char *)malloc(strlen(s)*3);
    int index = 0;
    for(int i = 0; i < strlen(s); i++) {
        if(s[i]==' ') {
            ret_char[index++] = '%';
            ret_char[index++] = '2';
            ret_char[index++] = '0';  
            
        } else {
            ret_char[index++] =  s[i];
        }
    }
    return ret_char;
}


发表于 2021-08-10 11:37:59 回复(1)
import java.util.*;
public class Solution {
    public String replaceSpace (String s) {
        // write code here
        return s.replace(" ","%20");
    }
}
发表于 2021-02-25 21:48:31 回复(0)
    public String replaceSpace (String s) {
        // write code here
        return s.replaceAll(" " , "%20");
    }

编辑于 2021-05-21 17:23:48 回复(4)
很烦,为什么书上不用Java写呢?
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String replaceSpace (String s) {
        if (s == null || s.length() == 0)
            return "";

        int spaceNum = 0;
        int m = s.length();

        for (int i = 0; i < m; i++) {
            char c = s.charAt(i);
            if (c == ' ')
                spaceNum++;
        }
        //p1指向原字符串末尾
        int p1 = m - 1;
        //p2指向替换之后字符串的末尾,spaceNum为空格数,3是"%20"的长度
        int p2 = p1 + spaceNum * 2;

        char[] tmp = new char[p2+1];
        for (int i = 0; i < s.length(); i++)
            tmp[i] = s.charAt(i);

        //当p1和p2指向同一位置时,说明已经替换完毕
        while (p1 >= 0 && p1 != p2) {
            if (tmp[p1] == ' ') {
                tmp[p2--] = '0';
                tmp[p2--] = '2';
                tmp[p2--] = '%';
            }else {
                tmp[p2--] = tmp[p1];
            }
            p1--;
        }

        return new String(tmp);
    }
}


发表于 2021-03-14 18:24:37 回复(1)
写一个空间复杂度为O(1)的原地置换,以防被面试官怼
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) {
        // write code here
        int cnt = 0;//统计空格数
        int len = s.length();
        for(int i=0;i<len;i++){
            if(s[i] == ' ') cnt++;
        }
        s.resize(len+cnt*2);
        int i = len - 1;//指向原字符串最后一个字符
        int j = s.length()-1;//指向空格替换成%20后的字符串最后一个字符
        for(;i!=j;i--){ //从尾到头替换空格,当i==j时空格替换完毕,无需继续
            if(s[i]==' '){
                s[j] = '0';
                s[j-1] = '2';
                s[j-2] = '%';
                 j -=3; 
            }
            else{
                s[j] = s[i];
                j--;
            }
        }
        return s;
    }
};



发表于 2021-03-29 21:20:39 回复(4)
#剑指offer上的是c,这是c++的版本

#include <string>
class Solution {
public:
    string replaceSpace(string s) {
        //如果要求原地替换
        if(s.size() == 0) {
            return s;
        }
        int originLen = s.size();
        int spaceCnt = 0;
        for(int i = 0; i < originLen; ++i) {
            if(s[i] == ' ') {
                ++spaceCnt;
            }
        }
        int newLen = originLen + 2 * spaceCnt;
        int p1 = originLen - 1;
        int p2 = newLen - 1;
        
        //扩容
        s.resize(newLen);
        //p1 = p2的时候,代表空格替换完毕
        while(p1 >= 0 && p1 < p2) {
            if(s[p1] == ' ') {
                s[p2--] = '0';
                s[p2--] = '2';
                s[p2--] = '%';
            } else {
                s[p2--] = s[p1];
            }
            --p1;
        }
        return s;
    }
};
发表于 2021-03-25 10:33:49 回复(1)
class Solution:
  def replaceSpace(self, s):
    string = ""
        for item in s:
            if item == "":
                item == "%20"
                string += item 
        return string

发表于 2021-07-30 13:42:40 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return string字符串
     */
    public String replaceSpace (String s) {
        // write code here
        return s.replace(" ","%20");
    }
}
发表于 2021-04-06 22:25:08 回复(0)
感觉题意应该不是直接用java的库,所以挨个遍历
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String replaceSpace (String s) {
        // write code here
        StringBuilder sb = new StringBuilder();
        char[] chars = s.toCharArray();
        for (int i = 0;i < chars.length; i++) {
            if (' ' == chars[i]) {
                sb.append("%20");
            } else {
                sb.append(chars[i]);
            }
        }
        return sb.toString();
    }
}

发表于 2021-02-25 22:25:17 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String replaceSpace (String s) {
        // write code here
        return s.replace(" ","%20");
    }
}
String的replace()方法

发表于 2021-12-15 17:12:16 回复(0)
public string replaceSpace (string s) {
        return s.Replace(" ","%20");// write code here
    }
编辑于 2021-07-11 23:57:19 回复(0)
class Solution:
    def replaceSpace(self , s ):
        # write code here
        return s.replace(' ','%20')

发表于 2021-03-19 22:26:27 回复(0)