算法、数据结构与设计模式篇
常见的排序算法及其时间复杂度
推荐一篇文章:http://www.jianshu.com/p/7d037c332a9d

这是我对这些算法的 JS 实现:https://github.com/lcx960324/fe-interview-cheat-sheet-demo/tree/master/Algorithm/Sort
常见的查找算法及其时间复杂度
什么是完全二叉树?
若设二叉树的深度为 h,除第 h 层外,其它各层 (1 ~ h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
堆排序的原理
利用大顶堆(小顶堆)根元素最大(最小)的特性,每次都构建大顶堆(小顶堆)然后再去除根元素重新构建大顶堆(小顶堆),即可完成排序。
Fibonacci 数列的实现方法
循环法
function fibonacci(n) {
var prevA = 1,
prevB = 1;
if (n === 0) return 0;
if (n === 1 || n === 2) return 1;
var curr;
for (i = 2; i < n; i++) {
curr = prevA + prevB;
prevA = prevB;
prevB = curr;
}
return curr;
}
递归法
function fibonacci(n) {
if (n === 1 || n === 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
找出 n 个数中第 k 大的数
使用 BFPRT 算法(线性查找法),时间复杂度 O(n) 。 推荐两篇关于 BFPRT 的文章:
我的 BFPRT 代码:https://github.com/lcx960324/fe-interview-cheat-sheet-demo/blob/master/Algorithm/Top K Problem.js
从 100 万个数中找出最大的 100 个数
这道题可以这么解:先找出第 100 大的数,然后再找出所有比这个数大的数。 找出第 100 大的数是一个 Top K 问题,可以使用 BFPRT 求解。 找出所有比这个数大的数,遍历就好啦~
两个房间,分别有三个开关和三个灯,每个房间只能进去一次,如何判断出开关对应的灯?
进入第一个房间,打开全部的三盏灯,如果都亮了,那很容易判断对应的灯是哪个了。 如果亮了两盏,先在这个房间确定两盏的对应关系,然后再去另一个房间确认另一个房间两盏的对应管系。 如果亮了一盏,先确定一盏的对应关系,然后把剩下找不到的两盏灯的其中一盏打开,然后去另一个房间确定剩下的关系。但是这只能确定一个房间的对应关系。 如果一盏都没亮,那要不让那个灯开一会儿,然后过个五分钟再开另一盏灯,关掉第一盏,然后去另一个房间摸一下温度?但是这只能确定一个房间的对应关系。
DOM 树的深度优先遍历与广度优先遍历
深度优先
function interactor(node) {
console.log(node);
if (node.children.length) {
for (let i in node.children) {
interactor(node.children[i]);
}
}
}
广度优先
function interactor(node) {
const arr = [];
arr.push(node);
while (arr.length > 0) {
node.arr.shift();
console.log(node);
if (node.children.length) {
for (let i in node.children) {
arr.push(node.children[i]);
}
}
}
}
JS 有哪些常用的设计模式
其实传统软件开发的设计模式很多都可以直接套用到前端项目上,比如:单例模式、工厂模式、观察者模式、适配器模式、代理模式。 推荐一篇文章:http://www.alloyteam.com/2012/10/common-javascript-design-patterns/
强烈建议大家认真学习一下前端提的最多的设计模式:观察者模式。
Last updated
Was this helpful?