剑指 Offer 05. 替换空格(点击立即答题)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制:
0 <= s 的长度 <= 10000
这是一道非常简单的题,简单题有简单题的要求,就是尽可能时间快,内存使用少,有的面试就喜欢考这种,每个人都会做,但是总有一些人的做法不一样,那样更快,内存占用更少。
解题思路:
1.创建一个字符类型数组aar,在最坏的情况下,字符串s全部为空格,那么arr大小定义为s.length()* 3;
2.对字符串s进行遍历,如果是空格,arr中依次加入‘%’、‘2’、‘0’,如果不是加入s.charAt(i)
3.返回字符串(注意:是返回字符串,不是数组,要把数组变成字符串)
java代码:
class Solution {
public String replaceSpace(String s) {
int n = s.length();
int size = 0;
char[] arr = new char[n * 3];
for (int i = 0 ; i < n ; i++) {
char temp = s.charAt(i);
if (temp == ' ') {
arr[size++] = '%';
arr[size++]= '2';
arr[size++] = '0';
}else {
arr[size++] = temp;
}
}
String newStr = new String(arr , 0 , size);
return new String(newStr);
}
}
这是LeetCode的官方做法,内存消耗较大,我们不要将数组arr定义为s.length()* 3,我们在99.9%的情况下是用不到这么大的内存的,我们可以定义一个count来统计空格的个数,最后将arr大小定义为s.length() + count * 2。
class Solution {
public String replaceSpace(String s) {
int n = s.length();
int count = 0;
for (int i = 0 ; i < n ; i++) {
if (s.charAt(i) == ' ') {
count++;
}
}
int size = 0;
char[] arr = new char[n + count * 2];
for (int i = 0 ; i < n ; i++) {
char temp = s.charAt(i);
if (temp == ' ') {
arr[size++] = '%';
arr[size++]= '2';
arr[size++] = '0';
}else {
arr[size++] = temp;
}
}
return new String(arr);
}
}
即使这样内存使用还是很大,我们在这里继续进阶一下,在java中有一个类叫做StringBuilder,他对于拼接字符串具有很快的速度。
java代码:
class Solution {
public String replaceSpace(String s) {
int n = s.length();
StringBuilder sb = new StringBuilder();
for (int i = 0 ; i < n ;i++) {
if(s.charAt(i) == ' ') {
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
在这里说明一下,LeetCode每次提交他给的内存消耗可能不一样,这可能是网速的问题。
若有误,请指教!