题目
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例:输入:s = “We are happy.” 输出:“We%20are%20happy.”
思路
首先扩充数组到每个空格替换成"%20"之后的大小。
然后 从后向前替换空格,也就是双指针法
i指向新长度的末尾,j指向旧长度的末尾。
为什么要从后向前填充,从前向后填充不行么?
从前向后填充就是**O(n^2)**的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
从后向前有两个好处:
1、不用申请新数组。
2、从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。
思路一
1、统计空格的个数 或者直接建立新的数组,将数组的长度扩大为原来的三倍
2、扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
3、从后先前将空格替换为"%20" 双指针
思路二
1、获得 s 的长度 length
2、创建字符数组 array,其长度为 length * 3
3、初始化 size 为 0,size 表示替换后的字符串的长度
4、从左到右遍历字符串 ,获得 s 的当前字符 c
如果字符 c 是空格,则令 array[size] = ‘%’,array[size + 1] = ‘2’,array[size + 2] = ‘0’,并将 size 的值加 3
如果字符 c 不是空格,则令 array[size] = c,并将 size 的值加 1
5、遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串
StringBuffer方法
String类是字符串常量,是不可更改的常量。
而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
StringBuffer和String属于不同的类型,也不能直接进行强制类型转换。
对于StringBuffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象实例化,必须通过构造方法完成。
StringBuffer连接字符操作
- 当一个字符串的内容需要被经常改变时就要使用StringBuffer。
- 在StringBuffer中使用append()方法,完成字符串的连接操作。
代码:思路二
class Solution {
public String replaceSpace(String s) {
int n = s.length();
char[] arr = new char[3*n];
int size = 0;
for(int i = 0; i < n; i++){
char c= s.charAt(i);
if(c == ' '){
arr[size++] = '%';
arr[size++] = '2';
arr[size++] = '0';
}else{
arr[size++] = c;
}
}
String newStr = new String(arr,0,size);
return newStr;
}
}