总结
秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!
而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。
这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)!
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
资料截图 :
高级前端工程师必备资料包
| <= 10^6
| O(nlogn) |
| <= 10^7
| O(n)
|
| <= 10^14
| O(sqrt(n))
|
| - | O(logn)
|
做题第二步:识别问题类型
我们在训练的初期,需要熟练各种解题模板。在熟练了解题的模板之后,我们才能够从题目内容倒退出题目的类型。
这也是为什么很多人推荐第一次要按照 tag 来进行刷题的原因,按照 tag 刷题也就意味着你可以对这种类型题目进行多方面强化,能够帮助你思考、总结、抽象到后面的举一反三。
按照 tag 刷题后,一般你会总结出常见的数据结构、思想以及算法,比如如下:
-
必须掌握的数据结构:数组、链表、栈、队列、堆、树、散列表、图、并查集
-
必须掌握的算法:递归、DFS 和 BFS、排序、二分法、双指针、滑动窗口
-
常用思想:分治、贪心、回溯、动态规划和分支界限
-
常见技巧:位运算、双指针、滑动窗口
在总结出这些常用抽象特征之后,往往你已经在 LeetCode 中已经过关斩将至少 100 题了。这也就意味着你已经进入了可以举一反三、联想关联的时候了。
但很多人在看到新题的时候还是不知道该如何联想到具体的解法,这通常意味着两点:
-
你对真正的解法理解的不够透,联想关联不够强
-
你对题目的抽象能力不够,也就是如何去除掉题目无关信息,提取出关键东西来
那么,这时候该怎么办。一个是在平时训练,尽量自己先想解法。如果实在想不出来(比如已经卡了一个小时了),就直接看答案,然后记录这道题目,过半个月在重新做一遍。
这里看答案也是有技巧的,你是怎么看答案的?你看答案的时候一定不能直接 copy 代码,而是先尽量理解答案的算法思路,然后用笔在纸上画出逻辑流程,如果不懂,再根据答案的示例代码脑袋里走一遍。最后关闭答案,自己写题目。
另外,我们可以通过题目关键字来帮助解题,我们在联想题解模板的时候,可以通过这些关键字来猜测。
- 如果题目中出现 连续子串, 连续子数组 这类的字眼,然后要求时间复杂度 ,那么你可以尝试用滑动窗口的思路解决。
举几个例子,比如 leetcode 中的 3. 无重复字符的最长子串
这道题目就是求最长的连续不含重复字符的子串,经典的滑动窗口题目。
76. 最小覆盖子串
同样可以抽取出来关键字 最小连续子串,而覆盖 T 中所有字符只是其中的制约条件而已,经典的滑动窗口题目。
解题第三步:草稿上写出算法思路
做算法题最忌讳的就是一看到题目,还没有想清楚思路和边界情况,就直接动手写代码。
能够直接动手写代码大概有几种情况:
-
你是超级大佬,比如楼教主这种
-
接近原题,或者这类题目你已经熟透了
-
题目太简单
但是,作为一般开发者,我还是推荐先写出算法思路。
举个例子,55. 跳跃游戏
我更加期望你能够这么在稿纸上写(当然你没有必要写这么多的字):
我们从开头开始遍历整个数组,并且维持一个最远距离值 max, 在遍历过程过,我们需要不断更新目前可以跳到最远的位置,也就是 max。
在遍历过程中,我们需要判断看当前位置是否小于等于 max:
- 如果是,继续下一个位置
- 如果大于 max,则表示无法到达最后一个位置
遍历结束可以在访问到最后一个元素或者通过判断 max 是否大于最后位置。
有了思路,我们写代码的时候往 bug free 就更进一步了
解题第四步:考虑边界情况
在有了思路之后,还需要提前考虑所有的边界情况以及初始情况。就拿上面的 55. 跳跃游戏 来讲,边界情况就是数组为空的时候:if(!nums.length) return true;
初始情况就是下标为 0 的时候:let max = nums[0] + 0;
最后代码就出来了:
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
if(!nums.length) return true;
let max = nums[0];
for(let i = 1; i < nums.length; i++) {
if(max >= nums.length - 1) return true;
if(i > max) return false;
max = Math.max(max, i+nums[i]);
}
return true;
}
整个解题过程快的话不会超过 5 分钟,后面我们可以在不断优化我们的解法,比如:
var canJump = function(nums) {
if(!nums.length) return true;
let len = nums[0];
for(let i = 0; i <= len; i++) {
len = Math.max(len, nums[i] + i);
if(len >= nums.length-1) return true;
}
return false;
};
JavaScript 刷算法题的劣势
用 JavaScript 做 leetcode 算法题或比赛的劣势是有不少的,基本处于所有语言的底层。效率比不过 java, c++ 这类静态语言(这意味着同样的测试集可能 C++ 可以通过,但是 JavaScript 通过不了),库函数的丰富性比不上 Python 这类动态语言(意味着我们需要自己编写很多功能函数)。下面我需要列举下在 JavaScript 比赛中的劣势:
1. 申请大容量的数组
在 JavaScript 中,由于 Array 可以存储任何类型数据,所以其开销往往会比静态语言大些。如果你申请的容量过大,很容易超出 v8 的最大可分配空间,我们此时又不能用 node 手段 hack。
此时我推荐各种 typedArray,比如Uint32Array
,这样可以尽量控制数组的开销。
2. 库函数的缺少
很多时候题目的解答需要很多已经封装好的数据结构,比如红黑树和堆。对于 JavaScript 我们只能自己去提前封装好。看到 Python 留下了泪水,import heapq
多么强大。
在这里我会推荐两种写法:
-
遇到这类问题,直接用 Python 之类语言写,我更加推荐用 Python, 因为库函数非常丰富,好学和编码简洁。
-
提前写好所有的库函数,要用到手动复制
3. 多维数组的申请
在 JavaScript 中写多维数组需要多写一些代码,也会带来比赛时间的劣势:
总结
秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!
而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。
这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)!
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
资料截图 :
高级前端工程师必备资料包