开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情
题目:剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
思路
首先是普通的我能想到的一般解法,也就是开辟一个新的空间来存放数据,这里使用StringBuilder来进行存放,比较方便,最后再将其转换回字符串的形式就可以了。
第二种解法是运用了双指针,这里也是先开辟了一个新的空间来存放空格,遍历s,当s中遇到空格时,就往sb中添加两个空格,这样sb中的空格数就是我们的目标字符串比s多的位数了,所以我们只需要将sb添加到s末尾,这样s的长度就自然地变成我们的目标字符串的长度了。
然后我们设置两个指针,在sb添加到s的末尾之前,先让left指针指向s的末尾,然后就将sb添加到s的末尾了,这时在让right指针指向新的s的末尾,如果left指针遇到了空格,就让right指针倒着输入%20,如果不是空格的话,就让right指向的位置变成left指针指向的字符。这样两个指针都向左倒着遍历。依此类推,最后我们就可以得到新的正确的字符串了,记得最后把字符数组转换成字符串型。
解法
class Solution {
public String replaceSpace(String s) {
if(s==null) return null;
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' ') sb.append("%20");
else sb.append(s.charAt(i));
}
return sb.toString();
}
}
另一种解法是双指针法,代码就是下面这样
class Solution {
public String replaceSpace(String s) {
if(s==null || s.length()==0) return s;
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
sb.append(" ");
}
}
if(sb.length()==0) return s;
int l=s.length()-1;
s+=sb.toString();
int r=s.length()-1;
char[] chars=s.toCharArray();
while(l>=0){
if(chars[l]==' '){
chars[r--]='0';
chars[r--]='2';
chars[r]='%';
}else{
chars[r]=chars[l];
}
l--;
r--;
}
return new String(chars);
}
}