数据结构我们可以归纳为以下几种:

  1. 数组
  2. 队列
  3. 链表
  4. 树(二叉树)

本章节我们先着重讲数组:

数组

创建数组的方式

  1. let arr = [1,2,3,4]

但是在算法题中,很多时候我们并不知道他的内部元素情况,这种场景下,更推荐使用构造函数创建数组的方法,而我们需要它往往是因为有创建指定长度的空数组这样的需求,需要多长数组,就给它传多大的参数:

  1. let arr = new Array() // 得到的是一个空数组
  2. let arr = (new Array(7)) // 这是创建一个长度为7的数组
  3. let arr = (new Array(7).fill(1)) // 这是创建长度为7,而且每项填充值为1的数组,即初始化的时候为[1,1,1,1,1,1,1]

给个小建议:个人推荐如果没有特殊需要,统一使用for循环来实现遍历,因为从性能看,for循环遍历起来是最快的

  1. let arr = new Array(7)
  2. for (let i=0; i<arr.length; i++) {
  3. console.log(arr[i],i)
  4. }

在创建数组fill传入参数的时候,如果这个参数是引用类型的话,那么fill在填充坑位的时候就是入参的引用,虽然初始化了7个一样的数组,但是这7个值对应了同一个引用、指向的是同一块内存空间,它们本质上还是一个数组,改变其中一个,其他的值都会相应改变

  1. let arr = new Array(7).fill([])
  2. console.log(arr) // [[],[],[],[],[],[],[]] 这时候生成7个值一样的数组
  3. arr[0][0] = 2
  4. console.log(arr); // [[2],[2],[2],[2],[2],[2],[2]] 这时候7个数组值都改变了

本着安全的原则,这里我推荐大家采纳的二维数组初始化方法非常简单(而且性能也不错)。直接用一个 for 循环来解决:

  1. const len = arr.length
  2. for(let i=0;i<len;i++) {
  3. // 将数组的每一个坑位初始化为数组
  4. arr[i] = []
  5. }

for 循环中,每一次迭代我们都通过“[]”来创建一个新的数组,这样便不会有引用指向问题带来的尴尬。