题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%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();
}
}