1 题目
leetcode
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.” ,则输出"We%20are%20happy."。
2 题解
2.1 循环替换
新建一个StringBuffer对象,遍历该字符串,遍历到非空格就直接添加,遍历到一个空格就替换,最后将该StringBuffer转换成String并返回
class Solution {
public String replaceSpace(String s) {
if(s==null || s.length()==0)
return s;
StringBuffer newS=new StringBuffer();
for(int i=0;i<s.length();i++) {
if(s.charAt(i)==' ') {
newS.append("%20");
}else {
newS.append(s.charAt(i));
}
}
return newS.toString();
}
}
运行通过
2.2 一次替换一段字符
上面的方法每找到一个非字符串就替换,尝试一次替换一段字符串
class Solution {
public String replaceSpace(String s) {
if(s==null || s.length()==0)
return s;
StringBuffer newS=new StringBuffer();
int flag=-1;
for(int i=0;i<s.length();i++) {
if(s.charAt(i)==' ') {
if(flag==-1) {
newS.append(s.substring(0, i));
newS.append("%20");
}else {
newS.append(s.substring(flag+1,i));
newS.append("%20");
}
flag=i;
}
}
if(flag==-1) {
return s;
}
if(flag<s.length()-1) {
newS.append(s.substring(flag+1,s.length()));
}
return newS.toString();
}
}
这方法是我舍友提出来的,我一开始没想到。
3 全解题解
全解上通过新建另一个字符数组来储存,统计字符串中的空格数,得出新字符数组的长度,使用两个指针从后向前遍历数组。
if(s==null || s.length()==0) {
return s;
}
int OriginPoint=s.length()-1;
StringBuffer sb=new StringBuffer(s);
for(int i=0;i<=OriginPoint;i++) {
if(s.charAt(i)==' ') {
//空格,加两个长度
sb.append(" ");
}
}
int newPoint=sb.length();
while(OriginPoint>=0) {
if(s.charAt(OriginPoint)==' ') {
//替换
sb.setCharAt(--newPoint, '0');
sb.setCharAt(--newPoint, '2');
sb.setCharAt(--newPoint, '%');
}else {
sb.setCharAt(--newPoint, s.charAt(OriginPoint));
}
OriginPoint--;
}
return sb.toString();
上面是我自己实现的,下面是全解的实现
public String replaceSpace(StringBuffer str) {
int P1 = str.length() - 1;
for (int i = 0; i <= P1; i++)
if (str.charAt(i) == ' ')
str.append(" ");
int P2 = str.length() - 1;
while (P1 >= 0 && P2 > P1) {
char c = str.charAt(P1--);
if (c == ' ') {
str.setCharAt(P2--, '0');
str.setCharAt(P2--, '2');
str.setCharAt(P2--, '%');
} else {
str.setCharAt(P2--, c);
}
}
return str.toString();
}
while循环的P2>P1可以提前结束循环,当两个指针重合的时候,意味着前面已经没有空格了。