写给零基础的前端算法入门指南,acmer带女友刷80+【递归与回溯篇】
前言
各位小伙伴们新年好呀,时隔一周,俺又回来更新文章啦!在上一篇发出去之后,虽然没有得到很多的阅读量,但是后面几篇文章还是得要更新出来,我想总能够帮助一小部分人咯~
现在和大家分享一下我们是如何准备算法这一块的,春招即将开启,还能最后准备一下,希望对大家有所帮助。
原本打算通过一篇文章介绍一下,推荐一下自己的刷题方式和刷题路线,得到一些伙伴的反馈:最好还是更加详细,面向零基础,小白这些,还有github
访问速度也是一方面问题,可能图片都加载不出来。
因此,我打算分模块出几期文章,这样你只用通过首发在掘金的文章即可了解 Chocolate
同学整体刷题汇总啦。马上就要过年了,希望能够帮助你的春招。打算出的内容计划安排如下:
🐮写给零基础的前端算法入门指南,acmer带女友刷80+【栈与队列与链表篇】(已完成🎉) 🐮写给零基础的前端算法入门指南,acmer带女友刷80+【递归与回溯篇】(本期已完成🎉) 🐮写给零基础的前端算法入门指南,acmer带女友刷80+【双指针与字符串篇】 🐮写给零基础的前端算法入门指南,acmer带女友刷80+【二叉树篇】 🐮写给零基础的前端算法入门指南,acmer带女友刷80+【动态规划DP篇】 🐮写给零基础的前端算法入门指南,acmer带女友刷80+【总结篇】
算法这一块到底如何准备
首先,我来简单介绍一下自己,在校打过ACM(如果没听过,当我没说,因为没有很大价值的牌牌,铁牌,参赛证以及证书倒是一堆)
如果你知道acm,并且参与过,对于国内前端(注意是说前端)面试的话,应该不需要花费很长的刷题时间,如果大家有想法了解我的acm经历的话,这个后续我会考虑在 B站发布一期视频。
那么对于零基础的小白来说,可能需要花10-20天左右时间来准备算法,而对于非科班来说这个周期可能会更长一点。那么,现在我准备来分享我是如何带着女友零基础刷题的。
第一点,明确算法它不是很难的东西,理解了其实就那会事,或许你还会喜欢上做题,当然,对于acm大佬做的题就另当别论了,这篇文章主体与面试水平为准 第二点,前端对于算法这一块的考察相对来说会偏简单一点,我在春秋招过程中遇到的笔试题都是一些常见的题目,比如搜索,贪心,简单动态规划,经典排序算法,都是以 leetcode
一些简单以及中等难度的居多,而这些算法对于科班来说的话,应该在学校都学习过,比如算法分析与设计,数据结构与算法这一类课程,那么有这个基础,你的刷题时间又可以进行缩短了第三点,既然说到要刷题,该如何刷,我在掘金参考了几个大佬(文末有参考处),大家都会推荐分专题来刷,在这里,我也是非常推荐的,在这里,我希望的是将刷算法题的数量再减少一点,带你入门,当你刷完这些专题之后,你就有相关思维能力主动去刷题了,而不是很被动的去刷,这样也很方便自己总结归纳~ 其它,可以参考大佬的文章,这里不再赘述...
一份思维导图,让你的刷题路线更简单
开门见山地说,首先提供一份思维导图,让知识由繁到简。
获取高清PDF,请在微信公众号【小狮子前端】回复【LeetCode】,一起刷题或者交流学习可以加企鹅群【666151691】
本仓库刷题路线参考 ssh (给大佬点赞) 仓库地址:https://github.com/sl1673495/leetcode-javascript
感谢大佬的归纳总结,原本打算在大佬那里打卡学习,后面考虑不太友好,还是自己新建了一个仓库打卡学习。
其次,本仓库解题代码大部分是自己的代码风格,题量也进行了拓展,将会持续更新下去,何不star收藏一下?
仓库介绍
仓库地址:https://github.com/Chocolate1999/leetcode-javascript
本仓库将全程使用的语言是 JavaScript
,是一个纯前端刷题路线,对于前端刷题没有方向的小伙伴简直是福音。解题代码会记录在本仓库的 Issues
中,会按照 label
进行分类。比如想查看 「递归与回溯」 分类下的问题,那么选择标签进行筛选即可。
同时,小伙伴们可以在 Issues
中提交自己的解题代码,🤝 欢迎 Contributing
,可打卡刷题,坚持下来的人最酷!Give a ⭐️ if this project helped you !
刷题路线
下面正式开始我们的刷题之路,给本篇文章点个赞,拿出自己心仪的键盘,开始!
以下专题顺序仅个人以及面试高频点来总结的刷题方式,大家可以根据自己的想法来组合。更多题集请参考本仓库哈~
热身题
面试题 16.11. 跳水板
面试题 16.11. 跳水板原题传送门
「题目描述」
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例 1
输入:
shorter = 1
longer = 2
k = 3
输出: [3,4,5,6]
解释:
可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。
提示:
0 < shorter <= longer
0 <= k <= 100000
「解题思路」
排列组合也算比较简单,需要 k
个板子,当我们短板有 i
个的时候,长板子就是 k-i
个,由于题目要求是将结果从小到大进行排序,那么我们起初就尽可能多的取短板子,最后结果就是通过 [0,k]
范围内遍历一遍即可。
对于特殊情况,即短板和长板长度相同时,我们只需要返回 k*len
即可,不然会重复计算。
var divingBoard = function(shorter, longer, k) {
if(k===0) return []
if(shorter === longer) return [k*shorter]
let res = []
for(let i=k;i>=0;i--){
let shortCnt = i
let longCnt = k-i
let cnt = shortCnt*shorter + longCnt*longer
res.push(cnt)
}
return res
};
1291. 顺次数
1291. 顺次数原题传送门
「题目描述」
我们定义「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。
请你返回由 [low, high] 范围内所有顺次数组成的 有序 列表(从小到大排序)。
示例 1:
输出:low = 100, high = 300
输出:[123,234]
示例 2:
输出:low = 1000, high = 13000
输出:[1234,2345,3456,4567,5678,6789,12345]
提示:
10 <= low <= high <= 10^9
「解题思路」
「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。
也就是例如 1234
这样的数字,然后给你一段区间确定范围。
官方给了枚举方式,反正数据量也不是很大,但是我觉得还是有很多数字没必要枚举,可以直接剪枝掉。我的做法是先求出最小值和最大值对应字符串的长度,即求出我们能枚举的数字的长度范围。
然后我们的起点的最小值从 1
开始,起点的最大值从 10-len
开始。为什么是 10-len
?举例说明,示例1给的是 [100,300]
范围的值,那么可枚举的长度 len
为 3,起点的最大值就位 10 - 3 = 7。那么此时顺次数为 789
但是不在我们区间范围内,舍弃。然后8、9
开头的数字就不需要枚举了。这样,我们就能剪掉一部门数据了。(虽然暴力是永远滴神...)
/**
* @param {number} low
* @param {number} high
* @return {number[]}
*/
var sequentialDigits = function(low, high) {
let res = []
let lowLen = low.toString().length
let highLen = high.toString().length
for(let i=lowLen;i<=highLen;i++){
for(let j=1;j<=10-i;j++){
let str = ''
let num = j
str += num
let k = i-1
while(k--){
num++
str += num
}
let ans = parseInt(str)
if(ans>=low && ans<=high){
res.push(ans)
}
}
}
return res
};
由于篇幅所限,更多内容请点击【阅读原文】观看,谢谢支持~
本文参考
前端该如何准备数据结构和算法? 写给前端的算法进阶指南,我是如何两个月零基础刷200题 (1.8w字)负重前行,前端工程师如何系统练习数据结构和算法?【上】 leetcode && leetcode各位题解大佬们,感谢你们~
结语
❤️关注+点赞+收藏+评论+转发❤️,原创不易,您的支持将会是我最大的动力~
访问超逸の博客,方便小伙伴阅读玩耍~
最后,祝各位新年快乐,牛年大吉,好运++,在准备春招の你,能够早点结束春招,offer拿到手软,希望我的文章能够帮助到你,我们很快会在下期相遇~
【作者:Chocolate】https://juejin.cn/user/2981531267112520/posts