题目描述
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
输入:s = "We are happy."
输出:"We%20are%20happy."
解答
解法一:创建新的字符串
var replaceSpace = function(s) {
// 直接创建新的字符串
var newString = '';
for(var i=0;i<s.length;i++){
if(s[i]==' '){
newString = newString+'%20';
continue;
}
newString = newString + s[i];
}
return newString;
};
这一解法非常容易想到,也非常简单。
另一种写法:
var newString = '';
var array = [];
array = s.split(' '); // ['we','are','hanppy.']
for(var i=0;i<array.length-1;i++){
newString = newString+ array[i]+'%20';
}
newString = newString + array[i];
return newString;
解法二:在原有的字符串s上进行替换,并保证输入的字符串后面有足够多的空余内存。
复杂度为o(n^2)
每发现一个空格,则将空格之后的字符统一向后移动两个字节。假设字符串的长度为n,则对每个空格字符都需要移动后面o(n)个字符,对于有o(n)个空格的字符串来说,需要的时间为o(n^2)。
var replaceSpace = function(s) {
// 复杂度为o(n^2)的解法
// 将字符串转换为字符数组
var array = s.split('');
var length = array.length;
for(var i=0;i<array.length;i++){
if(array[i]==' '){
p1 = array.length-1;
array.push('0');
array.push('0');
for(var j=array.length-1;j>i+2;j--){
array[j] = array[p1];
p1--;
}
// console.log(array[j]);
array[j] = '0';
// console.log(array[j]);
array[--j] = '2';
array[--j] = '%';
}
}
return array.join('');
}
复杂度为o(n):
首先遍历字符串,计算空格的个数,提前计算好替换后的空间。变量p1指向原字符串的末尾,变量p2指向替换后的字符串末尾。
接下来,逐个向前移动p1,并将指向的值复制到p2指向的位置,直到碰到空格为止。然后,在p2之前插入“%20”。
var replaceSpace = function(s) {
var num=0;
var length = s.length; //13
// 遍历得到空格数目,每找到一个空格,在s后补两个0
for(var i=0;i<s.length;i++){
if(s[i]==' '){
num++;
s+='0';
s+='0';
}
}
var p1 = length-1;
var p2 = s.length-1;
var array = s.split('');
while(p1<p2 && p1>=0){
while(array[p1]!==' '){
array[p2] = array[p1];
p2--;
p1--;
}
array[p2] = '0';
array[--p2] = '2';
array[--p2] = '%';
--p2;
--p1;
}
return array.join('');
};
知识点总结
string.split(''):将字符串转换为字符数组
string.split(' '):将字符串按空格分隔成多个子串,并保存在数组中
array.join(''):将字符数组转换为字符串
array.join():将数组元素拼接成字符串,无参数则默认以逗号连接