数据结构与算法
数据结构和算法,是工程师的内功,必须严修。本栏记录和总结数据结构和算法在前端代码中的应用。
richest_qi
这个作者很懒,什么都没留下…
展开
-
js实现数组转树型结构
const res = [ { id:100, parent:0, name:"前端开发", sort:100, children:[ { id:101, parent:100, name:"Vue", sort:101 }, { id:102, parent:100,原创 2021-07-01 09:51:26 · 212 阅读 · 0 评论 -
计算数学表达式的结果
function getLeftAndRight(express,i){ const REGEXP = /\d+(\.\d+)?/; const REGEXP2 = /[\+\-×÷]/; let front = express.slice(0,i); let back = express.slice(i+1); let temp = front.split(REGEXP2); let left = Number(temp[temp.length-1]); let r原创 2021-06-03 22:17:12 · 367 阅读 · 0 评论 -
【算法练习】字符串
构建回文串检测给你一个字符串 s,请你对 s的子串进行检测。每次检测,待检子串都可以表示为 queries[i] = [left, right, k]。我们可以 重新排列 子串 s[left], ..., s[right],并从中选择 最多k项替换成任何小写英文字母。如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结果为true,否则结果为 false。返回答案数组 answer[],其中 answer[i] 是第i 个待检子串queries[i]的检测结果。注意:在替换时,子串中的每原创 2020-07-12 18:10:28 · 221 阅读 · 0 评论 -
【算法练习】数组
井字游戏设计一个算法,判断玩家是否赢了井字游戏。输入是一个N x N的数组棋盘,由字符" ","X"和"O"组成,其中字符" "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" ")中。第一个玩家总是放字符"O",且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符。如果游戏存原创 2020-07-08 20:25:14 · 139 阅读 · 0 评论 -
【算法练习】二分查找
在线选举在选举中,第 i 张票是在时间为times[i] 时投给 persons[i] 的。现在,我们想要实现下面的查询函数: TopVotedCandidate.q(int t)将返回在 t时刻主导选举的候选人的编号。在t 时刻投出的选票也将被计入我们的查询之中。在平局的情况下,最近获得投票的候选人将会获胜。示例:输入:[“TopVotedCandidate”,“q”,“q”,“q”,“q”,“q”,“q”], [[[0,1,1,0,0,1,0],[0,5,10,15,20,25,30]],[原创 2020-07-07 19:01:25 · 163 阅读 · 0 评论 -
【算法练习】回溯
一条路往前走,能进则进,不能进则退,换一条路试试,这就是回溯。原创 2020-07-02 18:17:34 · 142 阅读 · 0 评论 -
【算法练习】动态规划
不同的二叉搜索树给定一个整数 n,求以1 ... n为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:卡特兰数设n个节点时,不同的二叉搜索树共有为G(n),F(i,n),根节点为i的二叉搜索树,其左子树的节点个数为i-1,右子树的节点个数为n-i,所以有G(n)=∑i=1nF(i,n)=∑i=1nG(i−1)+G(n−i)G(n)=\displaystyle\sum_{i=1}^nF(i,n)=\display原创 2020-06-29 22:47:20 · 183 阅读 · 0 评论 -
【算法练习】深度优先搜索
检查网格中是否存在有效路径给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是:1 表示连接左单元格和右单元格的街道。2 表示连接上单元格和下单元格的街道。3 表示连接左单元格和下单元格的街道。4 表示连接右单元格和下单元格的街道。5 表示连接左单元格和上单元格的街道。6 表示连接右单元格和上单元格的街道。你最开始从左上角的单元格 (0,0) 开始出发,网格中的「有效路径」是指从左上方的单元格 (0,0) 开始、一直到右下方的(m-1,n原创 2020-06-28 15:55:22 · 344 阅读 · 0 评论 -
【算法练习】二叉树
二叉树的实现 function TreeNode(val){ this.val = val; this.left = this.right = null; } function BT(){ this.root = null; } BT.prototype.insertNode = function(val){ if(this.roo原创 2020-06-20 22:38:07 · 241 阅读 · 0 评论 -
【算法练习】链表
随机读取,数组完美,链表不行;插入或删除,链表很在行,数组很笨。奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。示例 2:输入: 2->1->3->5->6->4->7->NULL输出: 2->3->6->7->1->5->4->NULLfunction ListNode(val, next) { thi原创 2020-06-17 22:02:57 · 187 阅读 · 0 评论 -
【算法练习】双指针
文章目录两数之和遍历嵌套用Map作缓存三数之和遍历嵌套两数之和给定一个整数数组 nums 和一个目标值target,在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。遍历嵌套function twoSum(nums,target){ var len = nums.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++){ if(nums[i]+nums[j] ===原创 2020-06-09 22:17:38 · 252 阅读 · 0 评论 -
查找
二分查找前提是,数组已经排好序function binarySearch(arr,target){ var left = 0; var right = arr.length-1; while(left <= right){ var mid = Math.floor((left+right)/2); if(target === arr[mid]){ return mid; }else if(targe.原创 2020-06-03 17:19:03 · 284 阅读 · 0 评论 -
排序
冒泡排序var arr = [3,5,1,7,9];function bubbleSort(arr){ var len = arr.length; for(var i=0;i<len-1;i++){ for(var j=0;j<len-1-i;j++){ if(arr[j]>arr[j+1]){ var temp = arr[j+1]; arr[j+1] = a.原创 2020-06-01 21:11:47 · 214 阅读 · 0 评论 -
实用的Map
Map和对象类似,区别在于,key不限于字符串,可以为其他类型的数据,比如,是一个对象。var o = { "foo":"bar"}var m = new Map();m.set(o,"hello");console.log(m.get(o));//输出 "hello"基本方法和属性set()get()delete()clear()has()sizecons...原创 2020-05-06 11:54:38 · 114 阅读 · 0 评论 -
实用的Set
Set和数组类似,区别在于Set中的项不会重复。Set的方法和属性add()delete()clear()has()sizevar s = new Set();s.add("red").add("green").add("blue");console.log(s.size);//输出 3console.log(s.has("red"));//输出 trues.del...原创 2020-05-06 11:10:39 · 113 阅读 · 0 评论 -
数组
数组有关的常用方法var colors = ["red","green","blue"];//toString()、join()都不影响原数组colors.toString(); //返回"red,green,blue"colors.join(); //返回"red,green,blue"colors.join("|"); //返回"red|green|blue"c...原创 2020-03-14 10:40:50 · 115 阅读 · 0 评论