首页 > 技术文章 > 【剑指offer】替换空格

Lrixin 2021-01-21 11:10 原文

题目链接:https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&&tqId=11155&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。


解题思路:先扫描一遍字符串,统计出空格数,从而得出替换后的字符串的长度。假设原字符串为为s1,替换后的字符串为s2,设置两个指针p1,p2.开始时,p1指向原字符串s1的末尾,p2指向替换后字符串s2的末尾。然后从后往前对原字符串进行扫描,如果p1遇到空格,那么在s2中填入“%20”,如果遇到字符,那么s2填入该字符。时间复杂度为O(Length),Length为替换后字符串的长度。


Cpp Code

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int space_num=0,oldlen=0,newlen=0;
        if(str==NULL||length<=0){
            return;
        }
        int i=0;
        while(str[i]!='\0'){//C/C++字符串以‘\0’结尾
            if(str[i]==' '){//统计空格数量
                space_num++;
            }
            oldlen++;
            i++;
        }
        newlen=oldlen+space_num*2;//替换后的字符串长度
        int j=newlen;
        i=oldlen;
        while(i>=0&&j>i){//退出条件,j==i说明继续扫描已不再需要替换,故j>i也可以是判断条件,不要这个条件也可以
            if(str[i]==' '){//空格,因为是从后往前扫描,故逆序填入
                str[j--]='0';
                str[j--]='2';
                str[j--]='%';
            }
            else{
                str[j--]=str[i];//非空格直接填入
            }
            i--;//指针向左移动
        }
        
	}
};


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





Java Code

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	//return str.toString().replace(" ","%20");//利用自带函数
        
        StringBuilder sb=new StringBuilder();//StringBuilder
        int len=str.length();
        for(int i=0;i<len;i++){
            if(str.charAt(i)==' '){
                sb.append("%20");
            }
            else{
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }
}

推荐阅读