随笔分类 - 算法/逻辑思想
摘要:扫盲: 描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 比如时
阅读全文
摘要:队列是一种先进先出的数据结。队列只能在队尾插入元素,在队首删除元素,这点和栈不一样。它用于存储顺序排列的数据。队列就像我们日常中的排队一样,排在最前面的第一个办理业务,新来的人只能在后面排队。队列这种数据结构在编程中被用到很多地方。 定义队列的操作 上图展示了队列的两个操作,入队和出队。出队操作是删
阅读全文
摘要:方便理解网站 栈是一种高效的数据结构,数据只能在栈顶添加或删除,所以这样操作很快,也很容易实现。栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用。接下来,用JavaScript实现一个栈的数据结构。 定义栈的操作 栈作为一种特殊的列表,只能从一端来进行访问,就像一摞盘子,放只能放在上面
阅读全文
摘要:其实判断新增和修改方法可以一个判断传入的length和数组的长度比较就可以得出,下面的代码是为了体会在vue3中实现reactivity方法对数组的拦截处理,数组会执行两次,一次是索引,一次是length,为了使得执行一次,写了一些方法判断,下面的代码是处理这个判断写了一些方法扩展下思路仅供体会 注
阅读全文
摘要:实现: function fun(...args) { if (args[2]) { console.log("exec"); } return args[0]; } function memo(fn) { var temp = []; var flag = true; //return出去的这个函
阅读全文
摘要:思想: 1.只有NaN不等于自身,通过这个特性去区分处理 2.通过一个变量开关,去控制添加次数(在循环中通过if条件) 3.找到第一次第一次就命中条件的,通过开关的作用把第一次的命中的元素push到数组中,后面的NaN重复的自然也就添加不进去 3.其他元素添加与否的条件通过判断数组中是否已经存在,通
阅读全文
摘要:思路:首先明白Promise.all的用法 1:promise.all可以接受一个由promise数组作为参数,并且返回一个promise实例, 2:promise.all([a,b,c...]).then方法之后的结果是一个数组,返回的数组是参数中依次执行的返回值 3: 参数中的promise有一
阅读全文
摘要:for循环太过简单,不赘述 var arr = [2, 5, 6, 8, 6, 8, 7, 12, 1, 3, 4, 100]; function totalFn(arr) { let total = 0; let len = arr.length - 1; function fn(len) { t
阅读全文
摘要:1.递归方式 // 斐波那契数列就是一个数组中的前两项的和=第三项的值 var arr = [1, 1, 2, 3, 5, 8, 13, 21, 34]; // 传入一个值,这个值是在数组中的位置(索引,不过索引是从1开始的) function fib(n) { if (n == 1 || n ==
阅读全文
摘要:方法一:双循环 var arr = [1, 2, 5, 3, 10, 12, 8, 9, 2]; var sum = 18; function findSum(arr, sum) { // 我们用x去测试复杂度 var x = 0; // 两层遍历 时间复杂度O(n^2) n的平方 O表示一个量级
阅读全文
摘要:1.首先两个数组要有序 2.不去重 var arr1 = [1, 2, 3, 4, 6]; var arr2 = [1, 5, 6, 7, 8]; function mergeSort(arr1, arr2) { const newArr = []; while (arr1.length > 0 &
阅读全文
摘要:思路:(这里只做了对象中如果有多层,多层嵌套还是个对象的形式) 1.把两个对象用Object.entries()转成数组,循环这两个数组,判断key和value,value再去判断数据类型(如果还是一个对象,那就用递归去重复),直到是基本数据类型的val1 == val2 2.通过一个中间变量去存储
阅读全文
摘要:1. 双循环去重 var arr = [3, 6, 8, 9, 7, 4, 4, 7, 9, 8, 6, 3]; // 双循环去重 function clearRepeat(arr) { for (let i = 0; i < arr.length; i++) { let cur = arr[i]
阅读全文
摘要:快速排序: 1.找一个基准值,比如把数组第一项作为基准值,作为数组内剩下的比较项; 拿基准值与数组内的每一项去比较,大于这个基准值的push进right数组内,小于的push到left数组内。 2.再用递归把left和right两个数组分别再按照这种逻辑拆分成左右数组,直到传入的数组length<1
阅读全文
摘要:冒泡排序: 1.双层循环,因为自己不用跟自己比,所以循环的时候要arr.length-1,比如数组length为5,<5-1 -> < 4 ->那么就是0 1 2 3 循环四轮 2.外层循环是轮数,内存循环是比较次数(握手问题一样,你上一轮已经给我握过手了,咱俩比较过了,在次数循环中不需要给你握了。
阅读全文
摘要:插入排序: 插入排序的原理是通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。与我们玩纸牌去排牌一样。 var arr = [5, 100, 25, 36, 42, 4, 2, 7, 389, 12, 8]; function insertSort(arr) { l
阅读全文
摘要:防抖: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content
阅读全文
摘要:树形结构转成(平铺)数组 var arr = [{ label: '一级 1', children: [{ label: '二级 1-1', children: [{ label: '三级 1-1-1' }] }] }, { label: '一级 2', children: [{ label: '二
阅读全文
摘要:方法一:for循环写法:最简单,拿到传入值在数组中第一次出现的索引 var arr = [1, 34, 21, 5, 2, 45, 15, 21, 24, 6]; function findIndex(arr, ele) { for (let i = 0; i < arr.length; i++)
阅读全文
摘要:方法一: 平铺到一个新数组后,再去分组组合成新数组 var arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ]; function fn(arr){ let len; let ary =[]; arr.forEach((x,index)=>{ arr.forEach
阅读全文