• Home
  • Archives
  Evan的博客
  • Home
  • Archives
  • 面试
  • 原理笔记
  • 项目实践
  • 其他

数据结构之数组

2020/10/10 posted in  面试
  • 数据结构之数组
  • 数据结构之队列
  • 数据结构之栈
  • 数据结构之链表
  • 数据结构之树
  • 数据结构之图

一维数组

数组是最简单的内存数据结构,一般来说存储同种数据类型,不过 js 允许数组存储不同的数据类型

插入元素原理:

  1. 插入到头部,需要所有元素向后移动一位,然后把新元素赋值给第一个位置
  2. 插入到尾部,直接赋值给尾部最后一个元素(在 C 或者 Java 中,因为要定义数组大小,所以添加元素的时候要新建数组,不能扩展原来的数组)
  3. 从头部删除,将所有元素向前移动一位,覆盖掉第一个元素,同时让数组长度减一(在 C 或者 Java 这类语言中,如果直接循环,由于最后一个元素是 undefined,无法赋值给倒数第二个元素,会报错)
  4. 从尾部删除,直接让数组长度减一,删掉最后一个元素
  5. 在任意位置添加或者删除,js 中提供了 splice 方法,原理是定位到需要插入 / 删除的位置,让后续的元素依次后移 / 或者前移覆盖
  6. 迭代一维数组,可以用 for…in 迭代器,也可以用 arr.forEach 方法(事实上尽量不要在数组使用 for…of 或者 for…in,虽然可以遍历,但是它们是用于遍历迭代器的,虽然数组自动生成了 arr.values() 迭代器,但是在某些时候并不能自动生成,如二维数组,for…of 二维数组是失效的)

二维数组

二维数组实际上就是矩阵,行代表一种属性,列代表一种属性。

但是在 js 中并不支持二维数组(矩阵),不过可以利用数组的嵌套达到相同的效果,如 arr = [[1, 2, 3], [4, 5, 6]],那么 arr[0] 代表的就是 [1, 2, 3] 这个数组,arr[0][0] 代表的就是 1 这个数值,实际上相当于矩阵:

行 / 列 0 1
0 1 4
1 2 5
2 3 6

迭代二维数组,可以用两个 for…in(注意这里用 for…of 是失效的),也可以用两个 arr.forEach 方法

多维数组

利用嵌套可以创建多维数组,比如创建一个 3x3x3 的三维矩阵,就是数组三维数组。在数据结构的数组中,不管多少维度,都可以利用循环遍历拿到对应位置的元素。

数组排序:

js 数组自身有 sort 方法,不过 sort 是将元素转换成字符串排序的。为了避免一些错误,一般 sort 传入一个比较函数,如

arr.sort(function(a,b) {return a-b})

数组搜索

  1. indexOf() 返回匹配元素的下标,如果找不到则返回 -1
  2. findIndex()与 indexOf() 类似,也是返回匹配元素的下标,不过接受的参数是一个回调函数。
  3. find()与 findIndex() 类似,也是接受一个回调函数,不过它返回的不是下标,而是元素本身。相对而言,findIndex()和 find() 用处更广,除了可以返回基础元素组成的数组,也可以返回引用元素组成的数组(如 [{id:1}, {id:2} ])

应用与算法

  1. 求斐波那契数列第 n 个数以及前 n 个数之和

« 数据结构之图

数据结构之栈 »

Evan的博客

Evan 的博客 - 非典型码农,bug永动机
Instagram Weibo GitHub Email RSS

Categories

面试 原理笔记 项目实践 其他 JS Vue 性能优化 算法 计算机网络

Recent Posts

  • 从 HTTP 发展历程重学计算机网络
  • 应届前端的逆袭(中)
  • 应届前端的逆袭(上)
  • 应届前端的逆袭(下)
  • 前端面经复盘

Copyright © 2015 Powered by MWeb,  Theme used GitHub CSS.