一 目录
不折腾的前端,和咸鱼有什么区别
目录 |
---|
一 目录 |
二 题目 |
三 解题思路 |
四 统计分析 |
五 解题套路 |
二 题目
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* @param {string} s
* @return {string}
*/
var replaceSpace = function(s) {
};
根据上面的已知函数,小伙伴们可以先尝试破解本题,确定了自己的答案后再看下面代码。
三 解题思路
如果面试都是这么简单,那我感觉会很开心!
jsliang 在写完 2 种解法后,时间是:03分30秒。
看一下我的两种解法:
解法 1:利用 JS Api
var replaceSpace = function(s) {
return s.split(' ').join('%20');
};
将字符串打成数组,再将数组合并成字符串,这法子应该很容易想到。
解法 2:空间换时间
/**
* @param {string} s
* @return {string}
*/
var replaceSpace = function(s) {
let str = '';
for (let i = 0; i < s.length; i++) {
if (s[i] === ' ') {
str += '%20';
} else {
str += s[i];
}
}
return str;
};
因为 JS 的字符串无法直接替换(我记得某种语言可以?C 还是 C#?)。
所以我们需要考虑的是,通过定义新的变量来控制空格转 '20%'
。
在这写下来的那一刻,有考虑过 slice()
方法,但是这样子太过繁琐,这里就不多讲了。
解法 3:正则替换
写完后就去看下大佬们题解,但是可能因为太过简单的缘故,出现比较多的,我没考虑到的,就是正则了:
使用正则:
s.replace(/\s/g, '%20')
这里我就不哆嗦了,代码也不贴了。
因为我是普通人,普通人不会想到用正则 ^_^ /手动狗头
四 统计分析
解法 | 执行用时 / 击败率 | 内存消耗 / 击败率 |
---|---|---|
解法 1 | 64 ms / 62.55% | 33.6 MB / 100.00% |
解法 2 | 64 ms / 62.55% | 33.6 MB / 100.00% |
是的不是你看错了,这两种解法都是一样的 “执行用时”?
有点怀疑,自己写个函数测试下:
测试函数
const s = 'We are happy.';
var replaceSpace1 = function(s) {
return s.split(' ').join('%20');
};
var replaceSpace2 = function(s) {
let str = '';
for (let i = 0; i < s.length; i++) {
if (s[i] === ' ') {
str += '%20';
} else {
str += s[i];
}
}
return str;
};
const getCalculationTime = (fn, s, name) => {
console.time(name);
fn(s);
console.timeEnd(name);
}
for (let i = 0; i < 5; i++) {
console.log(`计算次数 ${i}:`);
getCalculationTime(replaceSpace1, s, 'JS API');
getCalculationTime(replaceSpace2, s, '空间换时间');
console.log('------');
}
node index.js 得出结果:
计算次数 1:
JS API: 0.368ms
空间换时间: 0.056ms
------
计算次数 2:
JS API: 0.019ms
空间换时间: 0.004ms
------
计算次数 3:
JS API: 0.007ms
空间换时间: 0.004ms
------
计算次数 4:
JS API: 0.021ms
空间换时间: 0.006ms
------
计算次数 5:
JS API: 0.009ms
空间换时间: 0.004ms
可以看到我们的方法 2 中的空间换时间,对于字符串 'We are happy.'
转换成 'We%20are%20happy.'
,的确是比方法 1 快的!
enm...这就蜜汁尴尬了,以后都不能太过于相信 LeetCode 的提交记录了,我们还是尽可能采用自己的方法进行统计吧。
五 套路分析
本题暂未发现任何套路,如果有但是 jsliang 后面发现了的话,会在 GitHub 进行补充。
如果小伙伴有更好的思路想法,或者没看懂其中某种解法,欢迎评论留言或者私聊 jsliang~
不折腾的前端,和咸鱼有什么区别!
jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。
浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!
扫描上方二维码,关注 jsliang 的公众号(左)和 浪子神剑 的公众号(右),让我们一起折腾!
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。