天天看点

前端算法能力提高(数组,队列,栈)

马上开学就要大四了,也就意味着要面临就业了。接触前端东西也已经有一年多了,做了很多,但是在面试的过程中,总免不了被问算法,之前也一直不重视,认为目前开发也用不着还不如多问我点原生js,现在观念有一些转变,行业这么卷,肯定得有一些手段筛人,而算法也算是众多公司常用的手段吧,这个也能决定你的base,所以,人家既然要求,那我们也就不要反感。尽可能的提高自己,不管用不用,只要你要,我就有。

先从最基础的数据结构开始:

数组

一般我们定义数组:

或者

let c = Array.from('foo124')
 console.log(c) //["f", "o", "o", "1", "2", "4"]
           

再或者

const arr = (new Array(7)).fill(1)   //[1, 1, 1, 1, 1, 1, 1]
           

fill方法是为初始化的数组填上数据

当我们修改的时候只需要

arr[1] = 2 
 console.log(arr)  //[1, 2, 1, 1, 1, 1, 1]
           

当我们初始化数组填入的是空数组的话

const arr = (new Array(7)).fill([])
 console.log(arr) //[Array(0), Array(0), Array(0), Array(0), Array(0), Array(0), Array(0)]
           

当我们给二维数组赋值的时候会发现

arr[0][0] = 1
  console.log(arr) 
           
前端算法能力提高(数组,队列,栈)

其实我们在使用fill给数组赋值[]的时候,传入的值是一个指针,这些指针指向的是同一块内存地址。其实在这我们可以想一下深浅拷贝的问题。有兴趣自己去查一查或者看一下我的博客,我之前也说过。

数组的特点

其实数组的特点就是连续存储,我们定义一个数组,他在内存开辟了一段连续的内存空间,这点可以作为和链表的区别哈,先提前透一下。

数组的遍历

  • for循环
const arr = [1,2,3,4,5]
        for(let i = 0;i<arr.length;i++){
            console.log(arr[i])
        }
           
  • forEach
const arr = [1,2,3,4,5]
        arr.forEach(item=>{
            console.log(item)
        })
           
  • map
const arr = [1,2,3,4,5]
        let c = arr.map(item=>{
            return item
        })
        console.log(c)
           

forEach和map区别

他们两个都是遍历数组的方法,不过forEach会改变原数组,map不会改变原数组,会返回一个新数组。一般我们采用map方法的时候会对遍历数据进行再加工。

数组方法

  • shift

    删除数组首部的第一个元素(只能删一个,里边传参没用),改变原数组,返回删除的元素

  • unshift

    从数组首部添加元素(几个任意),改变原数组,返回改变后数组的长度。

  • pop

    删除数组的最后一个元素。改变原数组,返回删除的元素

  • push

    向数组的末尾添加一个或多个元素 改变原数组,返回改变后数组的长度。

  • filter

    匹配数组中每一项,将满足条件的那一项作为新数组返回,不会改变原数组

  • every

    对数组中所有元素进行判断返回一个布尔值,如果所有元素都满足则返回true,否则返回false

  • some

    对数组中元素进行判断,如果数组中有一个元素满足条件则返回true否则返回false

  • .concat

    合并两个数组,不改变原数组,返回合并后的新数组

  • join

    将数组转为字符串,不改变原数组,返回字符串

  • sort

    对数组进行排序,改变原数组,返回的也是排序后的数组。

  • toString

    把数组转成字符串([1,2,3]->“1,2,3”),不改变原数组,返回的是字符串

  • reduce

    接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

  • Array.isArray

    判断是不是一个数组,返回布尔值

  • Array.from

    一般用来创建数组,或者对数组进行操作接收三个参数,第一个是可迭代对象,第二个函数可选(对每一个元素进行什么样的操作)第三个可选是执行函数时的this对象

大致就是这些吧!

队列

队列其实就是排队,先进去的先出来,大家可以想一下咱们前端的事件循环机制,由于js是单线程的,所以当有同步异步问题就得有一定的规则来判定让哪个先执行,哪个后执行。规则就是同步先执行,异步后执行,异步又分微任务和宏任务,微任务先执行,宏任务再执行等等,大家可以自行查阅。如何用js来实现一个队列呢?很简单,就是用数组的方法,排队:进入:push,出来:shift;

特点:先进的后出来,只能从尾部添加元素,也只能从尾部取元素,对应的数组方法:pop和push。

具体应用请看后续,我会一直更新前端所需算法内容,我们一起提高,遇到疑问,留言,我一定会看,文章有哪里有问题,评论哈,毕竟我也是个垃圾

继续阅读