当前位置:   article > 正文

前端面试拼图-数据结构与算法

前端面试拼图-数据结构与算法

摘要:总结一些前端算法题,持续更新!

一、数据结构与算法

时间复杂度-程序执行时需要的计算量(CPU)

空间复杂度-程序执行时需要的内存空间

前端开发:重时间,轻空间

1.把一个数组旋转k步

array = [1, 2, 3, 4, 5, 6, 7] 旋转数组k=3, 结果[5, 6, 7, 1, 2, 3, 4]

思路1:把末尾的元素挨个pop,然后unshift到数组前面;

思路2:把数组拆分,最后concat拼接到一起

  1. /**
  2. * 旋转数组k步使用pop和unshift
  3. */
  4. function rotate1(arr: number[], k: number): number[] {
  5. const length = arr.length
  6. if (!k || length === 0) return
  7. const step = Math.abs( k%length) // abs 取绝对值,k不是数值是返回NaN
  8. // 时间复杂度o(n^2), 空间复杂度o(1)
  9. for (let i = 0; i<step; i++) { // 任何值与NaN做计算返回false
  10. const n = arr.pop()
  11. if (n != null ) {
  12. arr.unshift(n) //数组是一个有序结构,unshift操作会非常慢!!!O(n);splice和shift也很慢
  13. }
  14. }
  15. return arr
  16. }
  17. /**
  18. * 旋转数组k步使用concat
  19. */
  20. function rotate2(arr: number[], k: number): number[] {
  21. const length = arr.length
  22. if (!k || length === 0) return
  23. const step = Math.abs( k%length) // abs 取绝对值
  24. const part1 = arr.slice(-step) // O(1)
  25. const part2 = arr.slice(0,length-step)
  26. // 时间复杂度o(1), 空间复杂度O(n)
  27. return part1.concat(part2)
  28. }

常见内置API中的复杂度:

  • unshift: unshift 方法将给定的值插入到类数组对象的开头,并返回新的数组长度。时间复杂度为 O(n),其中 n 是数组的长度,因为在插入时需要将原有的元素逐一往后移动一位;空间复杂度为 O(1)。
  • splice: splice 方法用于从数组中添加或删除元素,并返回被删除的元素组成的新数组。splice 的时间复杂度为 O(n),其中 n 是数组的长度,因为在删除或插入元素后,需要移动数组中的其他元素以保持连续性;空间复杂度为 O(n),因为需要创建一个新的数组。
  • shift: shift 方法用于从数组的开头删除一个元素,并返回被删除的元素。shift 的时间复杂度为 O(n),其中 n 是数组的长度,因为在删除元素后,需要将数组中的其他元素往前移动一位以保持连续性;空间复杂度为 O(1),因为不需要额外的空间来存储。
  • concat: concat 方法用于将两个或多个数组合并成一个新数组。时间复杂度为 O(1),数组末尾操作;空间复杂度为 O(n+m),m、n是原数组长度,因为新的数组需要存储。
  • slice: slice 方法用于从数组中提取出指定范围的元素,并返回一个新数组(不改变原数组)。时间复杂度为 O(1);空间复杂度为 O(n),因为需要创建一个新的数组来存储提取的元素。

2.判断字符串是否为括号匹配

一个字符串s可能包括{}()[]三种括号,判断s是否是括号匹配

考察的数据结构是栈,先进后出;ApI: push pop length

栈 VS数组区别

栈:逻辑结构;理论模型,不管如何实现,不受任何语言限制

数组:物理结构;真实功能实现,受限于编程语言

  1. /**
  2. * 判断是否括号匹配
  3. */
  4. function matchBracket(str: string): boolean {
  5. const length = str.length
  6. if(length === 0) return true
  7. const stack = []
  8. const leftSymbols = '{[('
  9. const rightSymbols = '}])'
  10. for (let i = 0; i <length; i++) {
  11. const s = str[i]
  12. if (leftSymbols.includes(s)) {
  13. stack.push(s) // 左括号,压栈
  14. } else if (rightSymbols.includes(s)) {
  15. // 左括号,判断栈顶(是否出栈)
  16. const top = stack[stack.length-1]
  17. if (isMatch(top, s)) {
  18. stack.pop
  19. } else {
  20. return false
  21. }
  22. }
  23. }
  24. return stack.length === 0
  25. }
  26. /**
  27. * 判断左右括号是否匹配
  28. */
  29. functionn isMatch(left: string, right: string): boolean {
  30. if (left === '{' && right === '}') return true
  31. if (left === '[' && right === ']') return true
  32. if (left === '(' && right === ')') return true
  33. return false
  34. }

时间复杂度O(n); 空间复杂度O(n)。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/blog/article/detail/57236
推荐阅读
  • 数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)_双向链表插入头
    双向链表(DoublyLinkedList)是一种数据结构,它与单向链表相似,但每个节点不仅包含指向下一个节点的指针,还包含指向上一个节点的指针。双向链表的每个节点通常包含以下两个指针:-prev:指向上一个节点;-next:指向下一个节点... [详细]

  • 无向图的边数组是一个对称矩阵。/*顶点类型应由用户定义*//*边上的权值类型应由用户定义*/#defineMAXVEX100 /*最大顶点数,应由用户定义*/#defineINFINITY65535 /*用65535来代表∞*... [详细]

  • 特殊矩阵压缩存储... [详细]

  • 数据结构】第二章——线性表(6)详细介绍了通过C语言实现单链表的基本操作……【数据结构】C语言实现单链表的基本操作单链表基本操作的实现导言一、查找操作1.1按位查找1.1.1按位查找的C语言实现1.1.2按位查找的时间复杂度1.2按值查找... [详细]

  • 概念:链表是一种物理存储结构上非连续非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实现的。_单链表链表文章目录一、单链表的定义及其结构1.1.概念1.2.单链表的结构1.3.单链表的特点二... [详细]

  • 是一种先进后出(LIFO)的数据结构,在其中元素的的添加(称为“入”)和删除(称为“出”)仅在的顶部进行。因此,最后一个插入到中的元素是第一个从中删除的元素。它通常有两个主要操作:1.push:在的顶部插入一个元素。2.pop... [详细]

  • 一,二叉树的顺序结构实现二叉树的顺序结构堆的概念及结构堆的接口实现堆的创建接口函数堆向上调整算法堆向下调整算法取堆顶元素建堆的时间复杂度堆的创建,向上调整建堆法向下调整建堆法,向上调整建堆的时间复杂度向下调整建堆的时间复杂度堆的应用堆排序建... [详细]

  • 数据结构(DataStructure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法(Algorithm)是定义良好的计算过程,它取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一... [详细]

  • 数据结构队列基本操作C语言版)【数据结构队列基本操作C语言版)目录一、队列1、定义:2、优缺点:二、队列基本操作算法(C语言)    1、宏定义 &nbs... [详细]

  • 【数据结构】 常见的八大排序算法
    排序有内部排序和外部排序,这里八大排序就是内部排序,指直接插入,希尔,选择,堆排,冒泡,快排,归并,计数。附有动图解释和思维导图汇总_八大排序八大排序概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,这里八大排序就是内部排... [详细]

  • 【愚公系列】软考中级-软件设计师 016-数据结构(数组、矩阵和广义表)
    数组(Array)是一种用于存储多个相同类型的元素的数据结构。它可以被看作是一个容器,其中的元素按照一定的顺序排列,并且可以通过索引访问。数组的长度是固定的,一旦定义后,就不能再改变。矩阵(Matrix)是一个具有行列的二维数组。它是由一... [详细]

  • 注意:双链表不可随机存取,按位查找和按值查找操作都只能用遍历的方式实现,时间复杂度为。思路:从头结点开始,找到某个位序的前驱结点,对该前驱结点执行后插操作;思路:找到给定结点的前驱结点,再对该前驱结点执行后插操作;双链表的初始化(带头结点)... [详细]

  • 数据量的增长与程序运行时间增长所呈现的比例函数,则称为时间渐进复杂度函数简称时间复杂度。链式存储的表状结构,链表可以分为:单向链表、双向链表、循环链表、内核链表。1.只要空间足够,理论上可以存放无限个数据。1.数据访问不太方便(空间不连续)... [详细]

  • 性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1(度为0的结点数比度为2的结点数多1)二分搜索树的每个结点的值(大于其左子树的所有结点的值|小于其右子树的所有结点的值)性质1:在二叉树的第i层上至多... [详细]

  • 类型说明符数组名[常量表达式]说明:常量表达式中可以包含常量和符号常量(宏命名),不能包含变量。即C语言中不允许对数组大小作动态定义。线性表经常进行插入和删除操作长度可变而C中数组长度是不可变。数组名其实就是首元素地址所以也可以直... [详细]

  • /初始化//判断是否为空else。数据结构(队列Queue)文章目录一、队列1、队列的定义2、队列的顺序实现2.1、初始化2.2、入队2.3、出队2.4、查找2.5、判断队列满/空3、队列的链式实现3.1、初始化3.2、入队3.3、出队4、... [详细]

  • 【代码】数据结构.队列顺序表示。数据结构.队列顺序表示一、队列的定义二、队列顺序实现#include<iostream>usingnamespacestd;constintN=10;typedefstruct{intdat... [详细]

  • 【代码】数据结构.数据结构.一、的定义二、初始化#include<iostream>usingnamespacestd;constintN=10;typedefstruct{intdata[N];inttop;}SqSt... [详细]

  • 队列的定义,特点,队列的基本操作实现数据结构(队列)一.什么是队列1.队列定义    队列是一种特殊的线性表,特殊之处在于他只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入... [详细]

  • 的基本定义,顺序,链的介绍代码实现,力扣经典题分享数据结构()一.什么是1.的定义    是一种特殊类型的线性表,它的特点是仅允许在其一端进行插入(入)和删除(弹出)操作。这一端称为... [详细]

相关标签
  

闽ICP备14008679号