
算法
梅子丨朱
孤独是一个人的狂欢
展开
-
js 基础之new实现
function Person(name,age,sex) { this.name = name; this.age = age; this.sex = sex;}function newObj(Fn,args) { let re = {}; if(Fn.prototype !== null){ Object.setPrototypeOf(re,Fn.prototype);//指向Fn的原型 // re = Object.create(Fn.prototype);.原创 2020-12-17 13:47:50 · 268 阅读 · 0 评论 -
每日算法:发布订阅者模式实现proxy数据劫持(vue)(TypeScript版)
/** * 发布订阅者模式实现proxy数据劫持(vue)(TypeScript版) */interface Publish { register(eventName : string, sub : Subscribe) : void;//注册订阅者 remove(eventName : string, sub ?: Subscribe) : void;//移出订阅者 notify(eventName : string,obj: object) : void;//发布}i.原创 2020-10-19 17:42:38 · 626 阅读 · 0 评论 -
每日算法:利用proxy实现观察者模式(数据劫持)
知识储备:es6,设计模式。const observerSet = new Set();const proxy = target => new Proxy(target,{//观察者观察数据变化 set(target, p, value, receiver) { let result = Reflect.set(target, p, value, receiver); observerSet.forEach(fn=>{ fn();//set操作后执行观察原创 2020-10-19 15:57:55 · 331 阅读 · 0 评论 -
每日一题:求出dom中某个元素(span)出现的次数
It is so eazy!<html><head><title>span计数</title></head><body><div class="scroll"> <span>span计数1</span> <span>span计数2</span> <span>span计数3</span> <span>span计数原创 2020-10-19 13:20:57 · 350 阅读 · 0 评论 -
每日算法:instanceof 关键字方法重写
思路:instanceof 函数功能是用于检测构造函数的prototype是否在某个实例的原型链上。那么我们可以先获取该构造函数的原型链,一一检测,如果该实例的原型链上有该构造函数的原型,那么返回true,否则返回false。function instanceOf(left,right) { let protoLeft = Object.getPrototypeOf(left);//获取对象的直接原型链上的原型 let protoRight = right.prototype; while原创 2020-10-14 10:05:25 · 262 阅读 · 0 评论 -
每日算法:一道大厂常考的代码题
这是一道大厂常考的代码题 Input: 'aaaabbbccd' Output: 'a4b3c2d1',代表 a 连续出现四次,b连续出现三次,c连续出现两次,d连续出现一次 本题乍看非常简单,没啥难度,动手其实往往会卡壳,如果面试时会紧张,催你你会手足无措。平时多练习吧哈哈哈。function count(str) { //设计一个二维数组分别储存a,b,c,d等等。内层数组的长度就是统计次数 let arr = []; for(let i=0; i<str.原创 2020-10-13 09:37:15 · 332 阅读 · 0 评论 -
大厂面试:js 闭包的深刻理解(实例分解:如何实现无限累加的一个函数)
题目:实现一个无限累加的js函数sum(1, 2, 3).valueOf() //6sum(2, 3)(2).valueOf() //7sum(1)(2)(3)(4).valueOf() //10sum(2)(4, 1)(2).valueOf() //9分析:js里的闭包常见的是用函数作为返回值,那么,就会出现func()()这种形式的函数,也叫立即执行函数。故联想到本题应该利用闭包来实现上述函数。重点:利用返回值是一个函数来接收下一个括号里的参数值,至于有多少层,我们不用关心。st原创 2020-10-12 13:16:42 · 1218 阅读 · 0 评论 -
每日算法:给定一个二叉树,找出其最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree著作权归领扣网络所有。商业转载请...原创 2020-09-29 15:30:29 · 1857 阅读 · 0 评论 -
每日算法:快速排序详解以及手动实现
快速排序重点在于分区和递归,第一趟取第一个数,然后比这个数小的分到左边,比这个数大的分到右边。那么分区操作需要l,r和arr[l]三个参数,l表示左边开始位置,r便是右边开始位置,arr[l]l表示左边开始位置的数。这样就便于我们接下来进行分治法以及递归操作。其中分区方法可以利用循环比较,小的放左边,大的放右边。最为经典的方法就是挖坑填数法。例如:arr = [5,1,3,4,8,3,7,2]X = 5第一个坑为5,首先从arr从右到左找到第一个小于X=5的值为2,2放到5的位置,那么下一.原创 2020-09-28 15:59:12 · 452 阅读 · 0 评论 -
js中求数组中的数字最大值的几种方法探究
求数组中的最大值,不难相信大家都熟悉,不过动动手总是好的,哈哈哈,最近面试什么的俺发现了一个真理,理论和实践真的差了十万八千里。let arr = [2, 5, 8, 7, 4, 1, 22, 33, 66, 55, 2, 5, 8, 4, 8, 855, 5, 868, 5]//普通循环结构function findMax(){//es6提倡拓展运算符而不是arguments let max = -Infinity; for(let i=0; i<arguments.length.原创 2020-09-28 09:55:31 · 1444 阅读 · 0 评论 -
每日算法:冒泡,选择,插入排序第二次写
好久不复习,总是会卡耶 哈哈哈 再来一次let arr = [9,4,5,64,2,5,811,7,53,6,3,2,1,22,11,55,88,77,88,99,100]let arr1 = [9,4,5,64,2,5,811,7,53,6,3,2,1,22,11,55,88,77,88,99,100]let arr2 = [9,4,5,64,2,5,811,7,53,6,3,2,1,22,11,55,88,77,88,99,100]function sortBubble(arr){ l原创 2020-09-24 10:29:29 · 207 阅读 · 0 评论 -
每日算法:把一个数尽量分解为大于1和尽可能小的整数相乘
function getMember(num) { let n = 2; let arr = [] while(num !== n && num > n){ if(num % n === 0){ num = num / n; arr.push(n); } else { n++; } } arr.push(num); return arr;}console.log(getMember(80))//.原创 2020-09-23 10:00:43 · 584 阅读 · 0 评论 -
每日算法:分别按照二叉树先序,中序和后序打印所有的节点
题目描述分别按照二叉树先序,中序和后序打印所有的节点。示例1输入{1,2,3}输出[[1,2,3],[2,1,3],[2,3,1]]简单的递归算法:function threeOrders( root ) { // write code here let p1 = [] let p2 = [] let p3 = [] function pre(ro){ if(!ro){ return p1原创 2020-09-19 14:50:25 · 1636 阅读 · 0 评论 -
每日算法:设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
题目描述设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示set(x, y)若opt=2,接下来一个整原创 2020-09-17 23:38:23 · 882 阅读 · 0 评论 -
每日算法:输入一个链表,反转链表后,输出新链表的表头。
链表头指针指向头节点,尾指针指向null的有序指向。反转之后头节点应该是之前的尾结点。反转思路1.初始化一个pre结点null 作为反转之后的尾指针指向。2.改变后续结点的nod.next指向为pre。3.但是nod.next我们应当作备份,不然改变2种指向就找不到了,新建一个结点backup作为备份。循环1.做完第一波操作,backup结点和pre结点以及nod需要向后移动一位,nod就是我们备份的backup。2.backup结点向后移动一位。3.pre向后移动一位。原创 2020-09-17 21:53:11 · 326 阅读 · 0 评论