题目如下
请实现一个函数,把字符串 s 中的每个空格替换成"%20"
1.题目解读
把字符串 s 中的每个空格替换成"%20,学过Java基础的同学当然会java自带的替换字符串方法replaceAll将空格替换成"%20",但是并不是题目要求的解题思路,我们可以通过StringBuilder方法和数组解决该题。
2.题目解法
数组
求速度牺牲空间方法
我们使用静态数组方法,首先我们要创建一个数组,来储存原字符串数组和要替换的数组元素。我们在原数组和自己创建的数组设定一个指针,使用一个判断条件,如果不上是空格就将原字符串数组的元素放入自己创建的数组中,如果是空格就将其替换为%20,但是是我们自己创建出来的数组需要一个长度的,这个长度我们用极限法假设原字符串都是空格,那么我们都将其替换为%20,%20有三个字符串,假设原字符串长度为N,那么我们自己创建的数组长度应该为3N。
代码如下
public String replaceSpace(String s) {
int n = s.length();
char[] newArr = new char[3 * n];
//极限法求出空间大小
int j = 0;
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
//替换操作的实现
if (c == ' ') {
newArr[j++] = '%';
newArr[j++] = '2';
newArr[j++] = '0';
} else {
newArr[j++] = c;
}
}
return new String(newArr, 0, j);
}
求空间牺牲速度方法
但是我们可不可以准确知道我们创建出来的数组大小为多少咧?
答案是肯定的,一个空格代表2个字符串,我们可以再加一行代码,来求出空格个数,我们先遍历原字符串,加上一个判断语句,如果遇到空格,就开始计数进行++运算。
这样算出来空格个数乘以3再加上原数组元素个数就是我们创建数组的大小。
代码如下
public String replaceSpace(String s) {
int n = s.length();
int cnt = 0;
//先算出空格的个数
for (char c : s.toCharArray()) {
if (c == ' ') cnt++;
}
//新数组的大小
char[] newArr = new char[n + 2 * cnt];
int j = 0;
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
//替换操作的实现
if (c == ' ') {
newArr[j++] = '%';
newArr[j++] = '2';
newArr[j++] = '0';
} else {
newArr[j++] = c;
}
}
return new String(newArr);
}
空间复杂度都是 O(n)
时间复杂度都是 O(n)
StringBuilder
首先,我们肯定要遍历一遍字符串的所有字符,因为每个字符都有可能为空。接下来就是考虑当遇到空字符的时候,我们该怎么处理,最直接的想法当然是将空字符串直接替换为 %20,但是你要知道 Java 中的字符串是不变的,所以直接替换是不行的。
我们知道 Java 中有个 StringBuilder 是表达可变的字符串的。我们可以使用 StringBuilder 来实现替换空格,算法步骤如下:
1.初始化一个 StringBuilder 实例 sb
2.遍历字符串 s 的每个字符:
3.当遍历到非空字符的时候,直接将字符 append 到 sb 中
4.如果遍历到的是空字符,那么将 %20 append 到 sb 中
5.返回 sb.toString
代码如下
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == ' ') sb.append("%20");
else sb.append(c);
}
return sb.toString();
}
运行结果
最快的算法执行时间0ms