算法:总结
算法总结算法专栏,主要目的为了解决算法薄弱的痛点,本篇内容主要是总结一些算法知识点、分类总结
算法可以说一直以来是本人的一个痛点,以下文章可能总结的并不是很好,希望大家能多批评,并提出宝贵意见~
数组题目
二分查找双指针双指针指的是 使用两个指针,在数组、链表结构上指向的位置,通过同向或相向移动来维护、统计信息
双指针的方法
快慢指针两个指针同向而行,先派一个指针出去探路,这个称之为快指针,后面慢指针跟上例题:移动零、移除元素等等
左右指针两个指针相向而行,左右指针常解决的问题:二分查找、回文数判断、反转字符串
题目
分发饼干
算法:移除元素
移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
12345678// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝int len = removeElement(nums, val);// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}
示例 1:
123输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且 n ...
算法:合并两个有序数组
合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]解释:需要合并 [1,2,3] 和 [2,5,6] 。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0输出:[1]解释:需要合并 [1] 和 [] 。合并结果是 [1] 。
示例 3:
输入:nums1 = [0], m = 0, num ...
《代码精进之路》学习日志
最近拜读导师推荐的一本书 《代码的精进之路》 在这本书中,作者引用了许多名人谚语,一针见血,总是别有一番风味也能让你幡然醒悟。
命名变量名变量名应该是名词,能够正确地描述业务,有表达力。如果一个变量名需要用注释来补充说明,那很有可能说明命名有问题。
函数名函数名要具体,它体现的是做什么,而不是怎么做。
类名类名是一组数据和操作的封装。对于一个应用系统,我们可以将类分为两大类:实体类和辅助类。实体类承载了核心业务数据和核心业务逻辑,其命名要充分体现业务语义,并在团队内达成共识,如Customer,Employee等等;辅助类是辅佐实体类一起完成业务逻辑得,其命名要能够通过后缀来体现功能,例如,用来为Customer 做控制路由的控制类CustomerController,对于辅助类,尽量不要用Helper,Util之类的后缀,因为其含义太过笼统。
包名包代表了一组有关系的类的集合,起到了分类组合和命名空间的作用,包名应该能够反映一组类在更高抽象层次上的联系,例如Apple、Pear,我们可以将它们放在一个包中,命名为fruit。包的命名要适合,不能太抽象也不能太具体。如Apple,那么将 ...
vue3.0
Vue3.0的新特性及Vue3.0带来的新变化vue3.0 2020年9月发布,命名为One p
Vue3.0 带来的新变化
性能的提升 1.3~2x与vue2.x相比,mount 50%提升,内存占用小120%核心代码+ Composition API:13.5kb,最小11.75kb 可以单独使用所有的runtime:22.5kb(vue2是32kb)
为什么会有这么大的性能提升?Compiler 原理
静态的节点和静态绑定的class和id不再作更新处理(hoistStatic->SSR优化)
结合打包标记PatchFlag,进行更新分析在编译过程中会将template编译成ast语法树,ast是一个抽象的语法树,动态的内容打上标记,在更新的时候只更新动态的内容
事件监听器Cache缓存处理(cacheHandlers)
hoistStatic 自动针对多静态节点进行优化,输出字符串
KOA 洋葱模型
KOA 洋葱模型今天分享一道面试题【手写 KOA 洋葱模型】学习本文你将获得:
什么是 KOA 洋葱模型
为什么 KOA 使用洋葱模型
如何实现 KOA 洋葱模型
1. 什么是 KOA 洋葱模型KOA 是一个轻量的 Node.js 框架,洋葱模型是它的设计理念和核心实现思想。
HTTP协议的各个版本
HTTP 协议概况HTTP 是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认采用80端口,它使用TCP作为传输层协议,保证了数据传输的可靠性
HTTP 是一个无状态的协议,HTTP 服务器不会保存关于客户端的任务信息
HTTP 有两种连接模式,一种是持续连接,一种是非持续连接;非持续连接指的是服务器必须为每一个请求的对象建立和维护一个全新的连接;持续连接,TCP 连接默认不关闭,可以被多个请求复用;采用持续连接的好处是可以避免每次建立 TCP 连接三次握手时所花费的时间;
在HTTP1.0 以前使用的非持续的连接,但是可以在请求时,加上Connection: keep-alive 来要求服务器不要关闭 TCP 连接
在HTTP1.1以后默认采用的是持续的连接;目前对于同一个域,大多数浏览器支持同时建立 6 个持久连接
HTTP 协议的各个版本HTTP 是基于 TCP/IP 协议的应用层协议; 它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口
HTTP/0.9最早的版本是0.9版本,该版本及其简单,只有一个命令 GET
12GET / ...
JavaScript
原型和原型链原型
在 js 中我们是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性,这个属性是一个对象,这个对象上包含了该构造函数的所有实例共享的属性和方法
当我们使用构造函数新建了一个对象后,在这个对象的内部包含一个指针 __proto__,这个指针指向该对象所属构造函数的 prototype 属性对应的值, 在ES5 中这个指针被称为 对象 的原型
一般来说我们是不能够获取到这个值的,但是现在的浏览器都实现了 proto 属性,让我们可以访问这个属性,但是最后不要用这个属性, 因为它不是规范中规定的
ES5 中新增了一个Object.getPrototypeOf()方法,我们可以通过这个方法来获取对象的原型
原型链
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,这也就是原型链的概念.
原型链的尽头一般来说都是 object.prototype
原型和原型链的特点
JavaScript 对象是通过引用来传递的,我们创建的每一个新对象实体中 ...
事件模型
三种事件模型是什么?事件时用户操作网页时发生的交互动作或者网页本身的一些操作,现代浏览器一共有三种事件模型
DOM0 级模型
第一周事件模型是最早的 DOM0 级模型,这种模型不会传播,所以没有事件流的概念,但是现在有的浏览器支持一冒泡的方式实现,它可以在网页中直接定义监听函数,也可以通过 js 属性来指定监听函数,这种方式是所有浏览器都兼容的
IE 事件模型
第二种事件模型 是 IE 事件模型,在该事件模型中,一次事件共有两个过程,事件处理阶段,和事件冒泡阶段;事件处理阶段会首先执行目标元素绑定的监听事件;然后是事件冒泡阶段,冒泡指的是事件从目标元素冒泡到 document,依次检查经过的节点是否绑定了事件监听函数,如果有则执行,这种模型通过 attachEvent 来添加监听函数,可以添加多个监听函数,会按顺序一次执行
DOM2 级模型
第三种是 DOM2 级事件模型,在该事件模型中,一次事件共有三个过程,第一个过程是事件捕获阶段;事件捕获指的是事件从 document 一直向下传播到目标元素,依次检查经过的节点是否绑定了事件监听函数,如果有则执行,后面这两个阶段和 IE 事件 ...
函数的arguments为什么不是数组?如何转化成数组?
因为argument是一个对象,只不过它的属性从0开始排,依次为0,1,2…最后还有callee和length性。我们也把这样的对象称为类数组。
常见的类数组还有:
用getElementByTagName/ClassName/Name()获得的HTMLCollection
用querySlector获得的nodeList
那这导致很多数组的方法就不能用了,必要时需要我们将它们转换成数组,有哪些方法呢?
1. Array.prototype.slice.call()12345function sum(a, b) { let args = Array.prototype.slice.call(arguments); console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦}sum(1, 2);//3
2. Array.from()12345function sum(a, b) { let args = Array.from(argu ...