开启刷题 前端食堂的 LeetCode 题解仓库[1] 年初立了一个 flag,上面这个仓库在 2021 年写满 100 道前端面试高频题解,目前进度已经完成了 50%。 如果你也准备刷或者正在刷 LeetCode,不妨加入前端食堂,一起并肩作战,刷个痛快。 了解了树的基础知识后,马上开启我们愉快的刷题之旅,我整理了 8 道高频的 LeetCode 链表题及题解如下。 len-- } res.push(arr) } return res }; 时间复杂度: O(n) 空间复杂度: O(n) 07 二叉树的最大深度 原题链接[8] problems/binary-tree-level-order-traversal/solution/qian-duan-shi-tang-ti-jie-chao-hao-li-ji-jj2g/ [8] leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/qian-duan-shi-tang-ti-jie-chao-hao-li-ji-im8f
flag) break;}return arr;}console.log(bubbleSort([8,5,1,147,46,24,7]));我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖
对于前端初学者而言,这样的一个功能你做出来了那就很好,慢慢的,我们的工作年限越来越长,如果我们还继续那样做,这样,迟早会淘汰。这个时候,就需要对你的项目进行优化。之前讲到过对于react项目的优化。 这篇文章主要是针对于算法相关的代码进行优化,从而是程序的运行速度更快,已达到程序的优化。 算法更多的是针对于数据的增删改查,或许你认为前端涉及不到,如果这样想,那你就错了。 前端可能用的不多,但不会涉及不到,同时,了解算法,那么对于以后的职业道路也会有所帮助。
基本排序算法 这里主要介绍的基本排序算法主要包括: 冒泡排序,选择排序,插入排序,之后的文章会介绍希尔排序,快速排序等高级排序算法, 文章后面会对这几个算法进行性能比较. 基本排序算法的核心思想是对一组数据按照一定的顺序重新排列. 重新排列主要就是嵌套的for循环. 外循环会遍历数组每一项,内循环进行元素的比较. 注: 文中都以实现升序排序为例: 1.冒泡排序 冒泡排序是最慢的排序算法之一, 也是最容易实现的排序算法.使用这种算法进行排序时,数据值会像气泡一样从数组的一端漂浮到另一端,所以称之为冒泡排序.假设要对数组按照升序排列 preIndex--; } arr[preIndex + 1] = current; } return arr; } 4.基本排序算法的性能比较 arr.push(Math.floor((Math.random() * 100))); } return arr; } 分别记录3种算法所用时间
js 的基本数据类型的赋值,就是值传递。引用类型对象的赋值是将对象地址的引用赋值。这时候修改对象中的属性或者值,会导致所有引用这个对象的值改变。如果想要真的复制一个新的对象,而不是复制对象的引用,就要用到对象的深拷贝。
方案一:思想 首先对数组进行排序(小 》大),第一项为最小值,最后一项为最大值
= "0" + i; } return i; } </script> function formatTime(ms) { ms = new Date("2018/8/ 8 14:20:00").getTime() - Date.now(); if(ms <= 0){ document.getElementById("showTime").innerHTML image.png <head> <meta charset="UTF-<em>8</em>"> <title>简单时长倒计时</title> <SCRIPT type="text/javascript"> image.png <head> <meta charset="UTF-<em>8</em>"> <title>js简单时分秒倒计时</title> <script type="text export function encryptByDES(message) { var key = '$7%9R5Hh&yGDt' var keyHex = CryptoJS.enc.Utf<em>8</em>.
正文在前端中确实用到不少与树相关的的知识,比方说 DOM 树,Diff 算法,包括原型链其实都算是树,学会树,其实对于学这些知识还是有比较大的帮助的,当然我们学算法还是得考虑面试,而树恰好也是一个大重点 -- 起码在前端而言;主要原因在于,树它华而不实,比较下里巴人,需要抽象但是又能把图画出来不至于让你毫无头绪,简单而言就是看上去很厉害,但实际上也很接地气,俗称比较一般;要知道做前端的面试算法,考的不就是你有么得主动学习能力 ,抽象能力等,但是考虑到参差不齐的前端娱乐圈,考得难吧可能就全是漏网之鱼了,所以既要筛选出鱼,但是又不能难度过大,树就是那个比较适中的,所以赶紧刷起来吧朋友们;这里本来是要遵照 3:5:2 难度来刷,预计刷个 选题主要是那个男人精选的例题以及 Leetcode 中 HOT 题和字节专题,总的来说代表性还是够的,刷完应该大概或许能够应付一下树这方面的算法了。 ret = Math.max(ret, depth); }; dfs(root, 1); return ret;};递归 -- 自低向上既然有自顶向下,那么当然就有自低向上了;就我浅薄的算法能力而已
maxCountLetters, maxCount: maxCount}; } getMaxCount('aabbc'); //{maxCountLetters: ['a', 'b'], maxCount: 2} 2.排序算法 j]; arr[j] = temp; } } } return arr; } var arr = [1, 2, 8, 3, 4, 1]; console.log(bubbleSort(arr)); 3去重算法 function unique1(arr) { var newArr = []; for ( randomRang(min, max) { return Math.ceil(Math.random()* (max - min) + min);; } 9.二分查找 二分查找的前提是有序数组,算法的思想是 () { console.log(`index: ${index}`) } })(index) } }; 11.冒泡排序算法
前言 前几天逛 github 的时候看到一些前端的算法题,自己做了一遍发现还挺有意思的,因此整理了一下收录 daily-question 的 algorithm 文件夹中,后续会继续增加,本文分享我整理的十个算法题目 题外话:其实给这篇文章起名字的时候不知道起什么名字,看了下掘金命名的文章,整理了几个模板: 你不知道系列 ——《你不知道的前端算法》 满足系列 —— 《前端算法看这篇就足够了》 灵魂系列 —— 《前端算法之灵魂拷问 》 你真的懂吗系列 —— 《你真的懂前端算法吗?》 万字长文建议收藏系列 —— 《(万字长文,强烈建议收藏,错过没有)之前端算法》 最后想想还是朴素一点,不做标题党吧哈哈哈? { return getResult(num.slice(0, numLength - 8)) + '亿' + getResult(num.slice(-8)) } return getResult
这一步叫划分操作 3) 接着,算法对划分后的小数组(较主元小的值组成的的小数组, 以及较主元大的值组成的小数组)重复之前的两个步骤,直到排序完成 快速排序demo: function quickSort 1]] = [arr[index - 1], arr[pivot]]; return index - 1; } 选择排序: 大概思路是找到最小的放在第一位,找到第二小的放在第二位,以此类推 算法复杂度 } return arr; } 归并排序: Mozilla Firefox 使用归并排序作为Array.prototype.sort的实现,而chrome使用快速排序的一个变体实现的,前面三种算法性能不好 ,但归并排序性能不错 算法复杂度O(nlog^n) 归并排序是一种分治算法。
this.down(1) return temp }}const ret = kthSmallest([[1,5,9],[10,11,13],[12,13,15]],8) this.data.pop(); this.data[0]--; this.down(1); return item; }}console.log(rearrangeBarcodes([7, 7, 7, 8, 5, 7, 5, 5, 5, 8]));
最近看一些文章和题目有接触一些算法题,我整理了一下收录daily-question 的 algorithm 文件夹中,后续会继续增加,本文分享我整理的十个算法题目。 这个和我上一个算法《走楼梯的动态规划》有些相似,我们也来动态规划下: 假设数组和目标值如下 var nums = [8, 9, 2, 15, 7, 1]; var target = 9; 首先我们拿出第一个元素 例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最大的 4 个数字是 8,7,6,5,。 比较简单的是将这些数字组合成一个数组,然后进行从大到小进行排序,取前 K 个即可。 选择算法 对整个数组进行排序有点浪费,我们只是取前 K 个,后面剩下的不进行排序也行。因此,对此数组使用选择算法获取前 K 个数即可。 9, 2, 15, 7, 1]; console.log(getLargeNumber(nums, 3)); // [15,9,8] 复制代码 快排算法 我们可以利用快排中 partion 函数的思想来做做题
this.down(1) return temp }}const ret = kthSmallest([[1,5,9],[10,11,13],[12,13,15]],8) this.data.pop(); this.data[0]--; this.down(1); return item; }}console.log(rearrangeBarcodes([7, 7, 7, 8, 5, 7, 5, 5, 5, 8]));
作者:TeddyZhang,公众号:算法工程师之路 Day 8, C/C++知识点走起~ 1 编程题 【剑指Offer】翻转链表 输入一个链表,反转链表后,输出新链表的表头。 nullptr; return newHead; } }; 如果不使用额外的空间的话,我们可以使用两个指针pre和next, 对链表相邻的两个节点进行交换调整,这才是面试官想要看到的算法
一些关键点: 不稳定的排序算法 初始状态待排序序列基本有序,快速排序的时间复杂度为O(n^2),性能非常差 空间复杂度与递归树的高度成正比,平均来看是O(log2n) 划分函数的选择非常重要 优化,随机划分 QuickSort(a, l, p - 1); QuickSort(a, p + 1, r); } int main() { int a[] = {3, 1, 2, 4, 7, 0, 5, 8,
优化递归算法:对于一些需要递归调用的函数,可以使用缓存来避免重复计算,提高程序性能。 防抖和节流是两种常见的前端性能优化技术,它们都可以用来减少函数执行的次数,提高页面性能。 防抖 防抖(Debounce)是指在一定时间内多次触发同一个事件,只执行最后一次触发事件的函数。 总之,防抖和节流是前端开发中常用的性能优化技术,可以有效地减少函数执行次数,提高页面性能。
前言在前端工程上,日益复杂的今天,性能优化已经成为必不可少的环境。前端需要从每一个细节的问题去优化。那么如何更优,当然与他的如何怎么实现的有关。比如key为什么不能使用index呢? 相信你看完本文的diff算法就能略懂一些。 diff算法的概念diff算法, 是 Virtual DOM 产生的一个概念, 作用是用来计算出 Virtual DOM 中被改变的部分,然后根据算法算出dom的结果进行原生DOM操作,而不用重新渲染整个页面 手写diff算法的过程背景:dom对性能的消耗特别高,因此前辈们提出用js对象模拟dom的操作,计算出最后需要更新的部分。而dom本身的算法的时间复杂度是O(n ^ 3)。 DelProps',//表示该属性给删除 ChangeProps: 'ChangeProps',//表示该属性有变化 AddProps: 'AddProps',//表示该属性是新增的参考面试题解答参见 前端手写面试题详细解答
不管是在实际项目中还是在面试的时候我们大都会碰到算法问题,比如排序啊,比较大小啊之类的这些最基本的算法。我总结了一些,以后在碰到在慢慢补充。 1.排序问题 1.1冒泡排序 冒泡排序算法就是依次比较大小,小的的大的进行位置上的交换。 var example=[8,95,34,21,53,12]; function sortarr(arr){ for(i=0;i<arr.length-1;i++){ for 1.2快速排序 //快速排序 //1.这种方法比较简单,2019/8/5新增 var example=[1,4,3,8,9,6,2] function quickSort(arr){ 1] + fibarr[i - 2]) } i++; } return fibarr; } 6.二分查找 二分查找:是在有序数组中用的比较频繁的一种算法
属于一种暴力解题的思路;实际上也是如此,当我们在遇到一些分类讨论的问题,无法想到比较精妙的解决方案,我们第一时间考虑到的就是暴力枚举所有情况,然后再做处理,而 回溯 就是这样的一个暴力法下一个 tab 学习一下常规的排序算法吧正文在做回溯题 function isValid(s) { if (s.length > 1 && s[0] == 0) return false; // 不能以 0 起头 if (s >= 1 << 8)