要掌握以下几种数据解构
- 数组
- 栈
- 队列
- 链表
- 树(重点学习二叉树)
数组
数组的创建
最平常的创建数组方式
const arr=[1,2,3,4,5]
但是在算法题中用下面这种方式创建
const arr=new Array()
这种方式就是创建了一个 [ ] 空数组,用这样的方式的原因是算法题里常常有创建制定长度的空数组的要求。所以有时候要做到像下面这样,创建一个长度为7的空数组
const arr=new Array(7)
结果:
有时候需求会加一点,创建一个长度确定,每个元素的值也确定的数组。这个时候用到fill方法
const arr=(new Array(7)).fill(1)
结果:
数组的访问和遍历
访问:很简单
arr[1]
数组遍历
for循环
for(let i=0;i<arr.length;i++) {
// 输出数组的元素值,输出当前索引
console.log(arr[i], i)
}
foreach
arr.foreach((item,index)=> {
console.log(item,index)
})
map
const arrNew=arr.map(item=>item+2)
- foreach没有返回值,一般用于输出元素,修改属性等等
- map是在遍历的基础上再加工,返回一个新数组,map不会改变原数组。所以map用于在一个数组基础上再创建一个新数组
- foreach和map都不会被return和break打断,会遍历所有元素
- 从速度上来说,还是for循环最快最好
二维数组
二维数组的结构
const arr = [
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5]
]
把他的逻辑画出来,是这样
图中的每一行,就代表着一个数组元素。比如第 0 行,就代表着数组中 arr[0] 这个数组元素,其内容是 [1,2,3,4,5]。 每一行中的每一列,则代表一个确切的“坑”。比如第 0 行第 1 列,就代表着数组中 arr0 这个元素,其值为2,是一个确切的 number。
明白了二维数组的索引规律,现在我们来看一下二维数组的特点:从形状上看,相对于一维数组一条“线”一般的布局,二维数组更像是一个“面”。拿咱们这个例子来说,这里的二维数组逻辑分布图就宛如一个正方形。当然啦,如果我们稍微延长一下其中的一边,它也可以是一个矩形。
在数学中,形如这样 长方阵列排列的复数或实数集合 ,被称为“矩阵”。因此 二维数组的别名就叫“矩阵” 。
讲到这里,如果有对“矩阵”的定义一脸懵逼的同学,也不用怕——不知道“矩阵”是啥,一点不打紧(所以快停下你复制粘贴到 Google 的手哈哈),但你必须要 记住“矩阵”和“二维数组”之间的等价关系 。在算法题目中,见到“矩阵”时,能够立刻反射出它说的是二维数组,不被别名整懵逼,这就够了。
二维数组的初始化
这种方法初始化一个二维数组是行不通的
const arr=(new Array(7)).fill([])
这样看没什么毛病,创建了一个二维数组
但是修改一个数据就会发现
arr[0][0] = 1
你会发现一整列的元素都被设为了 1:
这其实是由于fill的机制引起的,当给fill传递一个参数的时候,如果传递的参数是引用类型,那么fill填充的是参数的yinyong,所以之前看起来好像是传递了7个空数组,实际上传递了7个一模一样的引用!
正确的初始化数组方法
const arr = [1, 2, 3, 4, 5]
for (let i = 0; i < arr.length; i++) {
arr[i] = []
}
二维数组遍历方法
const arr = [
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5]
]
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
console.log( arr[i][j]);
}
}