自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梁婉玲krysliang的博客

krysliang@163.com

  • 博客(94)
  • 收藏
  • 关注

原创 leetcode刷题日记-2022-3-14

1、有效的括号https://leetcode-cn.com/problems/valid-parentheses给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。/** * @param {string} s * @return {boolean} */var isValid = function(s) { let map = { .

2022-03-21 15:09:42 272

原创 算法日记-跳表

/** * * 跳表: * * 普通的单链表,一个节点指向下一个节点,如果想要在单链表中查找一个元素,必须要遍历整个链表才可以搜索到这个元素。 * 那么,如果我们想要像二分查找那样对链表进行搜索查找呢? * * 此时我们可以用另一个链表简历索引,每两个元素建立一个索引。比如 * * 1->2->3->4->5->6->7->8->9->10 * * 如果要查找的元素是10,那么我们就要从1开始遍历链表,查找到10则需要遍.

2022-03-14 17:19:19 134

原创 几条架构原则

一、KISS原则:keep it simple,stupid原则细说:保持每件事情尽可能的简单,用最简单的解决方案来解决问题。二、YAGNI:you aren`t gonna need it原则细说:不要搞一些不需要的东西,需要的时候再去写。不要写一些用不到的东西,最后导致代码包又大又冗余。三、爬,走,跑。原则细说:先保证功能能跑通,然后再去优化细节变得更好,然后再继续优化。迭代开发,敏捷开发。比如说第一个里程碑要什么时候完成,需要什么样的功能点,下一个里程碑是什么样的,不断的迭代。

2022-03-14 10:07:04 187

原创 使用Object.defineProperty实现数据的绑定通知

class Dep{ constructor(){ this.subs = []; } addSub(sub){ this.subs.push(sub); } notify(){ this.subs.forEach(sub => { sub.update(); }) } } ...

2022-03-08 11:48:55 126

原创 js 动手实现一个call、bind 、apply

​​​​​​检查当前调用的是否为函数 如果当前没有传入指向的this,则赋值为window 将fn指向当前调用的函数 获取传入的参数 将参数传入fn进行调用 将对象上的fn删除 返回结果 //普通call的实现 function hello(){ console.log('hello 我是'+this.name); }; let person = { name:'krys' }; var name = 'liang';//只有va

2022-02-21 17:44:33 238

原创 App Store 技术支持

如果您在使用过程中有问题请留言或发邮件我。邮箱地址:krysliang@163.com谢谢!If you have any questions, please leave a message or send me an email.Email:krysliang@163.comThank you!

2022-02-16 21:09:24 143

原创 手写简单的promise

const PENDING = 'pending'; const RESOLVED = 'resolved'; const REJECTED = 'rejected'; function newPromise(fn){ const _that = this; _that.state = PENDING; _that.value = null; _that.resolvedCa..

2022-02-15 09:31:35 290

原创 JavaScript B+树

/** * B+树的构造 * * * 1、第一步 改造二叉查找树(左边的子节点比当前节点小,右边的子节点比当前节点大) * 树中的节点并不存储数据本身,而是只作为索引,然后再每个叶子节点串在一条链表上,链表中 * 的数据是从小到大有序的。 * 改造以后,只要拿着区间的起始值在树中进行查找,当查找到某个叶子节点的时候,顺着链表往后遍历, * 直到链表中的结点数据值大于区间的终点值。那么遍历到的数据,就是符合区间值的所有数据。 * * 2、第二步 降低树的高度 减少读取节点的操作 从.

2022-02-09 11:43:16 1137

原创 JavaScript中跳表的定义与实现

调表

2022-01-24 16:04:29 407

原创 JavaScript Dijkstra算法 Astart算法

/** * 最短路径 * Dijkstra算法 * 首先根据起始顶点到当前顶点的dist 构建小顶堆,然后区堆顶元素。 * 取堆顶元素以后,需要从下往上堆化 * 然后取堆顶元素对应的邻接表中,更新每个顶点的dist值,并且入队。 */ class Graph{ constructor(v){ this.v = v;//图中的顶点 this.n = v.length; this.adj = new Array(this.n);//图...

2022-01-05 17:28:09 599

原创 JavaScript拓扑排序的实现

/** * 拓扑排序 * 凡是需要通过局部顺序来推到全局顺序的,使用拓扑排序来解决。 * 还可以使用拓扑排序来检测图中环的存在。 * * * 假设几个源文件之间两两之间的依赖关系已知,如何确定一个全局的编译的顺序呢? * 比如a依赖b,b依赖c,d依赖b * 那么编译顺序就是 c->b->a->d * 或者c->b->d->a * * * 我们使用一个有向无环图来实现拓扑排序。 * 文件之间的依赖关系抽象成一个有向图,每个源文件就是一个.

2022-01-05 17:27:00 986 1

原创 JavaScript动态规划的实现

/** * 动态规划 * 一个模型 三个特征 * 一个模型:动态规划适合解决的问题的模型:“多阶段决策最优解模型” * 三个特征:1、最优子结构(可以通过问题的子问题的最优解推导出问题的最优解)、无后效性、重复子问题 * 解决动态规划的两种思路:1、状态转移表法和状态转移方程 * 1、状态转移表:拿到问题的时候,定义状态,每个状态代表一个节点,然后画出递归树,从递归树中就可以看出来, * 是否存在重复子问题。然后画出一个状态表,每个状态包含三个变量,行、列、数组值。 * 根据决策的先后过程.

2021-12-24 15:24:18 208

原创 JavaScript贪心算法

/** * 贪心算法 * 贪心算法有:霍夫曼编码、prim和kruskal最小生成树算法、Dijkstra最短路径算法。 * * 什么是贪心算法: * * 1、针对一组数据,问题有限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。 * 2、每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。 * 3、举几个例子看下贪心算法产生的结果是否是最优的。 * * * 举例子 * 1、区间覆盖 * 假设有n个区间,区间的起始断点和结束断点.

2021-12-24 10:12:28 667

原创 算法-分治算法

分治算法

2021-12-24 10:11:42 86

原创 算法-回溯

回溯

2021-12-24 10:10:42 451

原创 算法-字符串匹配

字符串匹配

2021-12-07 15:39:13 174

原创 图 图的广度优先搜索、深度优先搜索

图、图的深度优先、广度优先

2021-11-23 17:43:27 298

原创 堆(优先队列)

堆(优先队列)

2021-11-22 14:48:44 81

原创 树与二叉树

/***树*树的概念**节点的高度=节点到叶子节点的最长路径(边数)*节点的深度=根节点到节点的路径(边的个数)*节点的层数=节点的深度+1*树的高度=根节点的高度(根节点到叶节点的个数)*//***二叉树*二叉树的概念*二叉树,每个节点最多有两个子节点,分别是左子节点和右子节点。**当除叶节点以外所有的节点都拥有左右子节点,且叶节点都在最底层的树,叫满二叉树。*...

2021-11-16 14:35:56 1116

原创 JavaScript哈希表

/** * 哈希表(散列表) * * 散列的思想,就是用key对应着一个value。将key转换为value的方法叫做散列函数,而散列函数得到的value就是散列值, * 散列值也叫做哈希值。这个value就对应着数组的下表,然后根据value去数组中对应的位置存取数据。 * * 散列函数,hash(key),其中key表示着元素的键值,has(key)-》value就是经过散列函数计算得到的散列值(哈希值)。 * * 散列函数设计的基本要求 * a.散列函数计算得到的散列值...

2021-11-10 14:02:47 1208

原创 JavaScript二分查找

/** * 二分查找法 * * 二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。 * 每次都通过跟区间的中间元素对比,待查找的区间缩小为之前的一半,等找到要查找到的元素,或者区间被缩小为0. * 时间复杂度为O(logn),非常高效的时间复杂度。 * * * * 二分查找的局限性 * 1)只能依赖于数组的这种数据结构,因为二分查找依赖于随机访问下标。 * 2)只能依赖于有序的数组。如果数据还没排序过,需要先排序再进行二分查找 * 3)只能使用与一组静态的数.

2021-11-02 17:09:34 84

原创 剑指offer day 3

1、剑指 Offer 05. 替换空格var replaceSpace = function(s) { let newS = s.split(' '); return newS.join('%20')};2、剑指 Offer 58 - II. 左旋转字符串var reverseLeftWords = function(s, n) { let s1 = s.slice(0,n); let s2 = s.slice(n,n.length); r.

2021-10-21 14:05:40 107

原创 剑指offer day2

1、剑指 Offer 06. 从尾到头打印链表/** * @param {ListNode} head * @return {number[]} */var reversePrint = function(head) { let stack = [],cur = head; while(cur){ stack.unshift(cur.val); if(cur){cur = cur.next;} } return stack;}

2021-10-20 15:52:56 57

原创 刷题日记-剑指 Offer 30. 包含min函数的栈

题目地址剑指 Offer 30. 包含min函数的栈解题思路:一个栈存放原来正常的数据,一个栈存放每次入栈时当前栈中最小值。var MinStack = function() { this.stack = [];//原来的栈 this.ministack = [Infinity]//存放按照压栈顺序中最小的那个值};/** * @param {number} x * @return {void} */MinStack.prototype.push = funct

2021-10-19 17:30:30 87

原创 算法刷题日记-剑指 Offer 09. 用两个栈实现队列

题目地址力扣解题思路:有两个数组,一个作为入栈数组,一个作为出栈数组。入栈直接将元素压栈;出栈的话,如果出栈数组还有元素就直接出栈,否则将入栈数组的元素全部出栈压到出栈数组中。var CQueue = function() { this.stackA = []; this.stackB = [];};/** * @param {number} value * @return {void} */CQueue.prototype.appendTail = fun

2021-10-19 16:53:56 73

原创 算法刷题笔记-两数相加

/** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */var addTwoNumbers = function(l1, l2) { let head = new ListNode(-1); let cur = head; let sum = 0,inter = 0; while(l1 || l2){ let val1 = l1?l1.val:0; .

2021-10-19 16:26:55 64

原创 算法刷题笔记-数字的补数

这题有两个思路:第一个就是暴力法,遍历每位进行判断赋值,结合js的方法varfindComplement=function(num){letbinString=num.toString(2)letnewString=''for(leti=0;i<binString.length;i++){if(binString[i]=='0'){new...

2021-10-18 17:22:41 63

原创 算法刷题日记-乘积最大子数组

题目链接:https://leetcode-cn.com/problems/maximum-product-subarray//** * @param {number[]} nums * @return {number} */var maxProduct = function(nums) { if(typeof nums == 'object' && nums instanceof Array){ if(nums.length ==1){

2021-09-09 15:34:03 88

原创 node中使用superagent、cheerio进行爬虫

想必很多人都有这样的一个幻想,我可不可以啥也不用干,就获得别人的劳动成果呢?比如,我想做一个类似与豆瓣这样的app来练手,但是我有没有数据进行支撑,这时候我就想,能不能把豆瓣上的内容爬下来,放到我自己的app里面进行显示呢?哈哈大家都这样!ok,立马来开干。首先我们创建一个express应用express接下来用vscode进行打开,并且安装以下插件npm install --save cheerio superagent然后打开route下面的index.js文件,

2021-08-31 17:21:27 574

原创 Flutter中的动画

今天来学习一下Flutter中的动画。我们在js+css中,已经习惯用css3中的animation,transform,transition这三个加在一起去做。我们像前端那样,先从静态的变换中谈论。一、变换组件在css中如果要先让一个元素发生平移,使用的是transform:translate,那么在flutter中,已经封装起组件进行使用,只用填入平移的位置就可以。1、平移​Transform.translate(offset: Offset(...

2021-08-12 15:16:50 1898

原创 Flutter 切换主题

在flutter中,ThemeData 来统一管理主题的配置信息。ThemeData 涵盖了 Material Design 规范的可自定义部分样式,比如应用明暗模式 brightness、应用主色调 primaryColor、应用次级色调 accentColor、文本字体 fontFamily、输入框光标颜色 cursorColor 等。如果你想深入了解 ThemeData 的其他 API 参数,可以参考官方文档ThemeData。我们先来定义一个全局的主题文件impor

2021-08-11 15:06:53 1418 1

原创 Flutter 中的数据共享

以前使用其他框架的时候,比如vue 会有vuex,react会有redux等数据共享方式。而刚使用flutter的时候,因为其编程语言和框架特性的不一样,可能一时半会很难上手。今天就来聊聊flutter中的数据共享。一、InheritedWidgetInheritedWidget是flutter中的一个功能型的widget,适用于在widget树中共享数据的场景,比如我们在应用的根widget树中通过InheritedWidget共享了一个数据,那么在它所有的子widget中都可以获取到这个共享

2021-08-11 14:57:20 1132

原创 Flutter 实战之dart语言

1、了解dart语言之前,先要理解一下什么是JIT和AOT。(1)JIT (just in time)即时编译。在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但运行速度和执行性能会因为运行时即时编译受到影响。(2)AOT (ahead of time)运行前编译。提前编译,可以生成被直接执行的二进制代码,运行速度快、执行性能表现好,但每次执行前都需要提前编译,开发测试效率低。在开发期间使用JIT编译,发布期使用AOT。flutter基于这两个机制,使得开发效率高,发布时执行快..

2021-08-09 17:20:50 366

原创 从顶部观看Flutter的架构与原理

Flutter 重写了一套包括底层渲染逻辑和上层开发语言的完整解决方案。这样不仅可以保持试图渲染在Android和ios上的高度一致,在代码执行效率和渲染性能上也可以媲美原生App的体验。那么,flutter是如何完成组件的渲染呢?在计算机系统中,CPU把计算好的内容交给GPU,有GPU完成渲染后放入帧缓冲区,随后视频控制器根据垂直同步信号VSync从帧缓冲区中读取帧数据交给显示器完成图像显示。(Skia是一个底层图像渲染的引擎,具体是怎么工作的,我也不了解,我只知道flutter将..

2021-08-09 15:15:30 179

原创 MongoDB

一、MongoDB相信大家最先学习的数据库应该是mysql这类关系型的数据库,那既然有了这么成熟的数据库了,我们为什么还要使用信的数据库呢?是因为Mysql在处理海量数据的时候效率会显著的变慢,所以就诞生了mongoDB这类的nosql数据库了。下面我们先来了解一下什么是mongodb1、mongodb数据存储格式mongodb使用json格式来存储记录,也就是说一条记录就是一个json,而存贮在mongodb是以BSON形式来存放。也就是说,数据记录的格式是j...

2021-07-19 18:14:29 2036

原创 使用Electron 创建桌面应用

Electron是一个使用前端的技术来创建桌面应用的框架,打包后可以再MAC、windows和linux上直接运行。1、安装安装的时候按照它官网的文档进行了搭建,但是一直报错,这也是个坑啊。后来把代码改了一下,按照下面的安装方式就可以了创建一个文件夹,然后先clone一个demo下来git clone https://github.com/electron/electron-quick-start然后执行npm i --save-dev ele...

2021-05-20 16:17:53 359

原创 使用webpack来构建项目

1、在webpack的官网可以看到,webpack是一个文件打包工具,它将复杂的的文件依赖打包成独立的资源文件。换句话说,在webpack里一切文件都是模块,通过loader加载文件,通过plugin注入钩子,最后输出由多个模块组合的文件。那么loader是什么呢?loader用来读取各类资源,比如css、js等。模块loader可以链式调用,链汇总的每个loader都将对资源进行转换,然后将结果传递给下一个loader。也就是说webpack使用loader来管理各类的资源。...

2021-05-20 15:37:58 464 3

原创 使用gulp来构建项目

gulp是一个前端构建的工具,用来快速进行一些操作。比如开发一个项目的时候,设计师给你的照片一般都是一个高清的图,但是这些资源往往是很大的。那你要压缩图片的话是不是要找一个网站去将图片一个一个的进行压缩呢。显然,这样的操作是很麻烦的。那么我们就可以利用gulp来进行这一项的操作。此外,还可以利用一些gulp的插件来进行别的操作,比如压缩js、css 、html代码等,还可以用来混淆js代码,合并js代码等。还可以自动加载、把目录下的所有文件进行重命名等等的操作。下面我们来进入gulp的学习学...

2021-05-08 11:33:25 795 1

原创 详细分析JavaScript设计模式

说设计模式之前首先要先了解一下有什么设计原则,也就是你新写一个模式,要遵循什么样的原则。一、设计原则1、单一职责原则:也就是一个对象或方法只做一件事情。尽可能的将对象划分成较小的粒度。2、最少知识原则:对象之间尽可能少进行通信,不要发生直接的交互,如果对象之间有需要进行通讯的,可以转交给第三方进行处理。3、开放-封闭原则:实体(类、模块、函数)等应该是可以拓展等,但是不可以修改,当需要改变一个程序等功能或者给这个程序增加新的功能等时候,可以使用增加代码的方式,尽量避免改变程序的源代码,...

2020-12-01 14:34:28 141 2

原创 几个常用的排序算法

一、插入排序插入排序分为直接插入排序和折半插入排序1、直接插入排序首先我们将数组的数据分为两个部分,已排序区间和未排序区间(在同一个数组中)。初始已排序区间只有一个元素,就是数组的第一个元素。算法的核心思想是取未排序区间中的元素,在已经排序区间中找到合适的插入位置将iq插入,并保证已排序区间数据一直有序。重复这个过程直到未排序区间中元素未空。当我们需要将一个数据a插入到已排序...

2019-11-28 18:02:43 143

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除