欢迎来到我的专题文章《前端面试题》系列,更多精彩内容持续更新中,欢迎关注!
本章我们来看一道前端经典的面试题。怎么解码一个被编码N次的url,先说一下url的编码和解码。这也是我的面试过程中真实的面试题,下面把我的做法分享给大家。
url编码和解码
这里面有一个坑,我掉进去了,我先说通过encodeURI来编码,decodeURI来解码。我话音刚落,面试官断了我说:你确定吗?
突然的打断让我有些不知所措,导致接下来的面试都不顺利。
我的大脑高速旋转,然后我想到了之前做微信分享的时候,我们传入url的时候需要将地址进行编码,那个好像用不是这个encodeURI,没错,是 encodeURIComponent 这个api,虽然我没有完整的将这个单词说出来,然后我结合业务场景,说出了url编码的一个应用,也算是勉强过关了吧。
说完了以后,面试官说:encodeURI和decodeURI已经不再建议使用了。转而我们应该使用encodeURIComponent 和 dncodeURIComponent来替代。
这个应该只是前戏了,关键是这个题目的本身该如何去解?
不着急解题,我们先来看看这两个api的基本用法。
编码后,程序会将我们的url中的特殊字符进行编码,生成一个新的url,如果继续编码,将会继续生成一个不同的url。
同理,我们再来看下解码过程。
我们将之前编码后的url进行两次解码,可以得到我们最终熟悉的url了。
好了,我们再来回到问题本身。如何解码一个被多次编码的url.也就是说,这个url我们是不知道它被编码了多少次的。
那这个问题该怎么解呢?
第一次面临这样的问题,在面试的过程中可能一下子被问住了。没关系,我们先来看另一个问题。
说:如果遍历一个文件夹中的文件夹和文件。相信这个问题很直白了。文件夹里面可能还有文件夹,里面可以无限嵌套。
其实稍微有些工作经验的就知道,文件夹的问题肯定是要用到递归来处理了。
好,我们再来类比一下我们的今天的这个问题。两个问题有什么相同的地方没有?
解题思路
不难发现,两个问题中,有一个共同的特点。那就是都有一个不确定的因素。不知道文件夹有多少层,不知道url被编码了多少次。
从类比结果我们可以知道,这个url编码的问题应该是要用到递归算法去处理了。
递归算法
关系递归算法的相关知识点,我前面的文章函数那点事已经有了详细的介绍,这里不再赘述了。
首先,我们找出终止条件。
如果一个url解码前和解码后的不发生任何变化,那么我们就可以判断这个url被完全编码出来了。
找出了终止条件,接下来我们调用自身的方法,我只需要将编码后的参数继续调用自身去编码即可。
好了,到这这个问题基本上可以解决掉了。
下面我来上完整的代码的结果
其实很简单,对吗?
好了,到这里,这个问题基本是可以是解决了。
总结:
- url编码和解码用到的新的api。
- 在面试过程中,凡是提到了不知道有多少次操作的,一般来说都要用到递归算法。
- 递归算法的核心技巧可以参考我前面的文章,这一点很重要,面试非常喜欢问。
最后给大家留一个真实的面试题,也是有关递归算法的。
将一个数组扁平化
var arr = [1,[2,3,[4,5]],[6,7,8,[9]]];
给出一个算法,让返回数组结果:[1,2,3,4,5,6,7,8,9];
这个题目就很直白了,一般来说我们知道用递归算法了。
这里是【畅哥聊技术】的《前端面试题》专题系列。更多内容持续更新中。
下期我们接着聊,未完待续。。。