2024年最全作为前端,我是如何在Leetcode 算法比赛中进入前100的?,前端最新面试题

总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 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 刷题后,一般你会总结出常见的数据结构、思想以及算法,比如如下:

  1. 必须掌握的数据结构:数组、链表、栈、队列、堆、树、散列表、图、并查集

  2. 必须掌握的算法:递归、DFS 和 BFS、排序、二分法、双指针、滑动窗口

  3. 常用思想:分治、贪心、回溯、动态规划和分支界限

  4. 常见技巧:位运算、双指针、滑动窗口

在总结出这些常用抽象特征之后,往往你已经在 LeetCode 中已经过关斩将至少 100 题了。这也就意味着你已经进入了可以举一反三、联想关联的时候了。

但很多人在看到新题的时候还是不知道该如何联想到具体的解法,这通常意味着两点:

  1. 你对真正的解法理解的不够透,联想关联不够强

  2. 你对题目的抽象能力不够,也就是如何去除掉题目无关信息,提取出关键东西来

那么,这时候该怎么办。一个是在平时训练,尽量自己先想解法。如果实在想不出来(比如已经卡了一个小时了),就直接看答案,然后记录这道题目,过半个月在重新做一遍。

这里看答案也是有技巧的,你是怎么看答案的?你看答案的时候一定不能直接 copy 代码,而是先尽量理解答案的算法思路,然后用笔在纸上画出逻辑流程,如果不懂,再根据答案的示例代码脑袋里走一遍。最后关闭答案,自己写题目。

另外,我们可以通过题目关键字来帮助解题,我们在联想题解模板的时候,可以通过这些关键字来猜测。

  1. 如果题目中出现 连续子串, 连续子数组 这类的字眼,然后要求时间复杂度  ,那么你可以尝试用滑动窗口的思路解决。

举几个例子,比如 leetcode 中的 3. 无重复字符的最长子串

这道题目就是求最长的连续不含重复字符的子串,经典的滑动窗口题目。

76. 最小覆盖子串

同样可以抽取出来关键字 最小连续子串,而覆盖 T 中所有字符只是其中的制约条件而已,经典的滑动窗口题目。

解题第三步:草稿上写出算法思路

做算法题最忌讳的就是一看到题目,还没有想清楚思路和边界情况,就直接动手写代码。

能够直接动手写代码大概有几种情况:

  1. 你是超级大佬,比如楼教主这种

  2. 接近原题,或者这类题目你已经熟透了

  3. 题目太简单

但是,作为一般开发者,我还是推荐先写出算法思路。

举个例子,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 多么强大。

在这里我会推荐两种写法:

  1. 遇到这类问题,直接用 Python 之类语言写,我更加推荐用 Python, 因为库函数非常丰富,好学和编码简洁。

  2. 提前写好所有的库函数,要用到手动复制

3. 多维数组的申请

在 JavaScript 中写多维数组需要多写一些代码,也会带来比赛时间的劣势:

总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

资料截图 :

高级前端工程师必备资料包

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值