题目:leetcode剑指 Offer 05. 替换空格
描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
思路:
第一种方法:使用一个StringBuilder字符缓冲区,将字符串s中的字符一个个取出来,如果是空格则将"%200"加入字符缓冲区,否则将当前字符加入字符缓冲区。这样做的时间复杂度和空间复杂度都是O(n)
第二种方法:使用一个使用一个StringBuilder字符缓冲区,遍历字符串s的每一个字符,如果是空格,则给字符缓冲区添加两个空格的字符串。最后得到的字符缓冲区的大小就是要扩容的大小,我们直接将字符缓冲区转为字符串,再拼接到s的末尾。最后我们使用一个双指针法来替换元素,左指针指向原字符串的最后一位,右指针指向新字符串的最后一位,两个指针同时向低位移动,如果左指针是空格,则右指针添加三个字符‘0’、‘2’、‘%’,否则只添加左指针指向的字符。
方法1:
public class Solution {
public String replaceSpace(String s) {
if(s.length()==0||s==null)
return s;
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();
}
}
虽然方法1看起来代码最少,但是效率最低!
方法2:
public class Solution {
public String replaceSpace(String s) {
if(s==null || s.length()==0)
return s;
//计算出需要扩充的容量
StringBuilder str=new StringBuilder();
for (int i=0;i<s.length();i++)
{
if(s.charAt(i)==' ')
str.append(" ");
}
//如果str为空,则说明字符串里面没有空格,则直接返回即可
if(str.length()==0)
return s;
//定义两个指针,一个指向原来的字符串的末尾,另一个指向新的字符串的末尾
int left=s.length()-1;
int right=s.length()+str.length()-1;
//如果有空格,则将需要扩充的空间大小以空格的形式加到s的末尾
s+=str.toString();
//s转为字符数组
char[] chars=s.toCharArray();
//不断让左指针和右指针移动,发现' '之后使用%20填充,否则将左指针指向的数据传到右指针
while(left>=0){
if(chars[left]==' ')
{
chars[right--]='0';
chars[right--]='2';
chars[right]='%';
}
else {
chars[right]=chars[left];
}
//左右指针同时移动一位
right--;
left--;
}
return new String(chars);
}
}
方法2看起来代码多,但是效率最高