自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 诙谐的谈谈TCP三次握手和四次挥手

这几天面试校招生,需要考量一下他们的计算机网络基础,就问了这个老生常谈的问题,说一下TCP三次握手和四次挥手,为什么挥手比握手要多一次?其实这个问题几乎所有人都能回答,甚至有的回答的很"标准",完全把课本上的答案背了下来说了一遍,甚至还知道SYN,ACK标志位,但是这些东西对我来说没有什么意义,因为这些标志位换成别的代号照样能完成三次握手和四次挥手。其实我想要知道的就是你怎么理解这个过程,三次握手的目的是什么?解决了什么问题,为什么不采取其他方案?比如二次握手或者四次握手?这才是关键所在。其实三次握

2020-12-12 02:17:42 277 1

原创 cocos图片的预乘以及图片混合渲染模式

传统的后乘alpha算法在shader或者混合配置中的代码如下:blend(source, dest) = (source.rgb * source.a) + (dest.rgb * (1 – source.a))经过预乘后的图片在shader或者混合配置中的代码如下:blend(source, dest) = (source.rgb * 1) + (dest.rgb * (1 – source.a))相当于预乘后的图片在进行混合渲染时就不需要再乘以图片的alpha值了,少了一层...

2020-12-06 16:46:04 3300

原创 JavaScript中的迭代器(interator)和生成器(generator)

通常js原生的可迭代对象,比如Array, Map, Set等都可以使用for...of来进行迭代,也可使用...obj的方式来拆解开,是因为他们对应的对象在底层都实现了可迭代方法@@iterator,其实就是Symbol.interator方法。这个方法在调用后会返回一个可迭代对象,该对象中只需要包含next方法,每次迭代都需要调用next方法,next方法返回类型是{value: any, done: boolean}。value表示当前迭代到的值,done表示迭代是否完成。是不是感觉这种方法有点似曾.

2020-12-06 12:46:10 618

原创 前端工程化最佳实践之husky,代码提交检测

husky其实就是哈士奇,搞笑的名字,二哈。作用就是在git执行一些操作的时候触发一些钩子,在钩子处执行一些自己需要的命令,比如代码的eslint校验等。最佳实践一般是校验两处,eslint(代码规范)及commit message规范先安装husky:yarn add husky在项目根目录创建.huskyrc配置文件,内容如下:{ "hooks": { "pre-commit": "lint-staged", "commit-msg": "commitlint -

2020-12-04 11:23:17 4429

原创 熟悉WebGL的一小步,用WebGL绘制一个变色三角形

const canvas = document.getElementById("canvas");const gl = canvas.getContext("webgl");const vertexShaderSrc = `// 一个属性变量,将会从缓冲中获取数据attribute vec4 a_position;attribute vec4 a_color;// varying关键字声明的变量可以从顶点着色器同名映射到片断着色器varying vec4 v_color;// 所有着...

2020-11-18 14:33:42 216

原创 mac npm install gulp失败

报错如下:gyp ERR! configure error gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/gulp/node_modules/fsevents/.node-gyp'gyp ERR! System Darwin 18.0.0gyp ERR! com...

2019-02-26 12:53:19 1395 1

原创 isNaN()的应用

之前一阵对这个函数有误解,以为它可以鉴定一个变量或者值是不是数字(是则返回false,不是返回true),今天亲自试了一下才明白,原来它是鉴定一个变量或值是不是可以被转换为数字(是则返回false,不是则返回true)。所以很多时候千万不能看别人的结论然后默默记下,可能会记错一辈子,能动手尝试的千万不能乱bb对多个变量进行尝试得到如下结论:对isNaN传入参数: 返回结果:1=====...

2019-01-03 16:48:48 1035

原创 关于在谷歌浏览器动画在进行过程中其他元素出现抖动问题

   开发过程中发现一个现象,某个执行动画的元素,在动画进行中,动画元素所经过的元素或者动画旁边的元素会出现抖动现象,看起来很奇怪又摸不着头脑,参考网上有些技术文章后发现是由于动画执行过程中可能会导致某些设定position:fixed元素的z轴坐标发生改变,不是z-index,而是translateZ()对应的值发生改变。   经过测试对出现抖动问题的元素加上translateZ(0)以后,...

2018-08-22 11:15:14 951

原创 css3的全局属性inherit, initial, unset

1:inherit属性的意思是被应用属性继承父级的该属性,比如border-width:inherit,意味着边框宽度继承父级。每个元素都有该属性,也都有默认值,默认为inherit:yes的大致如下:所有元素可继承:visibility 和 cursor内联元素可继承:letter-spacing、word-spacing、white-space、line-height、color、font、 ...

2018-05-25 10:29:55 3242

原创 利用css3实现3D立方体旋转

<!DOCTYPE html><html><head> <title>cssBox</title> <style type="text/css"> *{ padding: 0; margin: 0; } #stage{ /*舞台元素,该元素作为舞台,不用进行3d操作,舞台内部的元素需设置为3

2018-05-17 10:01:02 640

原创 猴子吃香蕉过河问题分析与扩展

第一次接触这个题目是大学找工作时候的一次笔试,题干意思是说有一座桥长50m,桥的一端放着一堆香蕉总共100根,还有一只猴子,这只猴子想要过桥,但是每走1m就要吃一根香蕉(每移动1m要吃一根香蕉,否则饿死,就是这么矫情),并且猴子身上最多可以放50根香蕉,再多就被压死了。问:猴子最多可以把多少根香蕉搬到桥的另一端?乍一看觉得不太科学,觉得猴子搬不过去,搬过去数量为0,仔细考虑,猴子是可以往返搬运...

2018-04-17 10:15:43 2089

原创 获取给定字符串最长不重复子串

一开始的思路就是暴力解决法:获取所有的子串,写一个可以判断字符串是否有重复字符的函数,来排除重复字符串的可能,没找到一个无重复字符的子串,记录长度,找出最大长度的子串即可,这里只记录最大长度:class Solution { public boolean isRepeat(char[] subStr, char curChar, int length) { bool...

2018-03-27 21:24:58 1201 1

原创 设计模式之单例模式:singleton

/*单例模式意味着一个类只能实现一个对象,可以避免某些功能冲突,也可以节省内存,因为限制了对象的创建 */class Unique{ private Unique(){} //把构造函数设置为私有,确保类的外部不能实例化该类 static Unique unique = null; //为了避免线程不安全,可以把null改为new Unique(),在类刚加载的时候就实例化一个对象,在下...

2018-03-24 23:54:21 155

原创 设计模式之工厂方法模式:不同区域的pizza口味

package factory;/*为了克服简单工厂模式对修改开放的缺点,进一步改进,把工厂方法抽象化,加以延伸,使得在子类中进一步决定如何去实现pizza对象, * 本文中引入了不同地区的披萨商店可以自己定制本地风格的披萨系统,利用工厂方法设计模式对简单工厂中的方法抽象化,提升代码弹性 */interface Pizza    //抽象产品类(接口){ void makePizza(...

2018-03-24 23:10:08 389

原创 设计模式之简单工厂模式:订做Pizza

package factory;/*简单工厂模式,这个模式比较简单,只是把new的语句单独封装在了一个类中,一般放在静态方法里 * 本次场景是披萨店有多种不同的披萨,以下举例了2种,分别为芝士披萨和牛肉披萨,如果披萨种类有很多,则创建的时候就要经常用new操作 * 符创建新对象,单例模式就是把创建新对象的实现方法封装起来,需要具体pizza对象时候直接调用该方法就可得到,只需传入一个参数,但...

2018-03-24 22:29:52 901

原创 设计模式之装饰者模式:星巴克咖啡

package decorate;/*headfirst设计模式 第三章节 装饰者模式,装饰者模式分为装饰者与被装饰者,它们必须共享同一个超类,或者接口,因为只有这样,才可以用 * 装饰者替换被装饰者(被装饰者对象被装饰者装饰后变成了装饰者对象,只有它们两个对象可以相互替换才可使用装饰者模式) * 本章节把咖啡饮料比作被装饰者,把调料比作装饰者,用新的调料来装饰饮料,得到新的装饰者对象 ...

2018-03-24 18:33:55 3488

原创 设计模式之观察者模式:天气布告板

package firstPro;/* headfirst设计模式 第二章节 观察者模式,实现了一对多的关系,观察者模式分为主题(subject)和观察者(observer)两个模块,观察者可以 看做是订阅消息的人,主题可以看做推送消息机构,机构有了新消息会立即推送给订阅者,数据是属于消息机构的,订阅者可以取消订阅,就不会 收到相关消息,未订阅者也可以注册添加为新的订阅者 */impo...

2018-03-24 17:01:25 368

原创 设计模式之策略模式:模拟鸭子

package firstPro;/*headfirst 设计模式第一章节 策略模式,模拟鸭子游戏,由于鸭子的颜色种类固定,不经常变动,所以把颜色相关函数放在超类Duck中,由于 鸭子的fly和kua两个行为经常要变更,或者增加新的表现行为,大致先用以下两种方案: 方案一:如果把该行为也放在Duck超类,以后每添加一个新行为,则所有子类都会继承该行为,包括那些不想添加该行为的子类,牵一发而...

2018-03-24 14:23:28 2304

原创 利用jquery实现多张图片淡入淡出

功能描述:图片播放分为2个顺序:正序和反序,正序就是从第一张到最后一张,然后再第一张,反序是从第一张开始,然后最后一张,再到第一张。1:当没有鼠标操作时,图片正序播放,每隔特定时间播放一次。2:如果鼠标从左向右滑动,则图片跳过间隔时间,播放顺序强制切换为正序,立即播放至下一张。3:如果鼠标从右向左滑动,则图片跳过间隔时间,播放顺序强制切换为反序,立即播放至下一张。实现思路:

2018-01-14 16:44:03 2854

原创 kruskal与prim最小生成树算法

以下代码未经验证:#include#includeusing namespace std;#define MAXINT 0xffff#define vertexNum 10typedef struct Graph{ int border[vertexNum][vertexNum];}Graph;typedef struct border{ int v1; //第一个

2018-01-13 23:43:06 178

原创 线索二叉树

线索二叉树就是把普通二叉树所有的空指针给利用了,如果左孩子指针为空,则让它指向前驱节点,如果右孩子为空,则指向后继(不同的遍历方法前驱后继不一样,一般是用中序遍历),但是有个问题就是需要知道左右孩子指针所指的节点究竟是前驱后继,还是说左右孩子,这时可以用ltag和rtag两个bool变量来判断,如果ltag=false则指的左孩子,为true则指向前驱,rtag类似。重写结构体如下:typed

2018-01-13 21:29:38 187

原创 Trie树(字典树)

hihocoder的题就有这个,这里主要写了创建与查找,查找用了两种方式,迭代与递归#include#includeusing namespace std;typedef struct trieTree{ char word = 0; int counts = 0; struct trieTree* children[26] = {0}; //26个小写字母}Trie;

2018-01-07 21:09:52 157

原创 硬币找零问题

硬币找零问题1:给定几种硬币的面值,每种硬币数目无限多,给定一个数值,求出用这些已有的硬币加起来组成的价值等于这个数值的所有组合情况可以用回溯思想来解决此问题,加入硬币为{1,2,5},目标是组成10,我刚开始是想用递归解决,每递归进去一层,都重新从1,2,5中选取一个数,加上之前累加得到的数,判断是否大于或等于10,这个思路是有问题的,会造成重复,比如某次挑选的路径为1,2,5,后来还会出现

2018-01-07 15:43:08 2036

原创 完全背包问题的分析与优化

完全背包问题跟01背包的区别是01背包每个物品只能选一次,总共就这几个,而完全背包问题是每个物品可以无限选,只要装得下。可以看成是有几种物品,每种都无限多个。如何根据01背包问题的分析成果来分析完全背包呢?其实很简单,.01背包在选第i个物品时,容积够用情况下,只有2种状态可选,放还是不放,找出最大价值的选择而完全背包在选第i种物品时,容积够用情况下,可能有2种以上状态可选,放1个,或者2个,3个...

2018-01-06 22:11:05 6804 6

原创 01背包问题的分析与优化

背包问题是动态规划的经典问题,可以分为多个子结构,如,只使用第1个物品在背包容量为1的情况下背包所能装的最大价值:为V[1][1]只使用第1个物品在背包容量为2的情况下背包所能装的最大价值:为V[1][2]只使用第1个物品在背包容量为j的情况下背包所能装的最大价值:为V[1][j]只使用第1,2个物品在背包容量为j的情况下背包所能装的最大价值:为V[2][j]只使用第1,2,3...i 个物品在背...

2018-01-06 21:40:59 5696 9

原创 排列与组合问题

这里利用了回溯思想:全排列相对简单,不过以下代码待优化,可以如果把数组换成链表,每挑出一个数,就把这个数删除,下一层就可以少遍历一次,不用使用visited[]数组来判断是否挑过它了,浪费时间,还浪费空间。void GetPermutation(int set[],int result[],int length,int deepth = 0){ if(deepth == length)

2018-01-05 19:40:07 193

原创 求一个集合的所有子集问题

可以用递归法,也可以用二进制对比法递归法可以想象成二叉树,可选择的状态选项只有2个,有这个元素和没有这个元素,先一条道走到头,然后回溯一步,再走到头...也就是回溯法。递归法代码如下:void GetsubSet(int set[],bool have[],int length,int deepth = 0){ if(length == deepth) { cout << "

2018-01-05 12:29:02 1824 1

原创 二叉排序树的创建,插入,遍历,节点删除,整个删除的封装

#includeusing namespace std;typedef struct BSTree{ int key; struct BSTree *LChild , *RChild;}BSTree;class CBSTree{private: BSTree *root; //二叉排序树的根节点,可以代表一个树 bool SearchKey(int key,BSTree

2018-01-04 13:13:07 688

原创 js通过canvas实现动画效果

有个要注意的点,就是canvas标签本身自带width与height属性,设置此属性可以直接更改canvas坐标系的宽与高,而在css里设置宽高,只是把canvas坐标系拉伸了,坐标值不变,显示出来的图像也都被拉伸了。var canvas = document.getElementById("canvas");var parti = [];function loop(){

2018-01-03 15:54:23 4838

原创 马踏棋盘算法

#includeusing namespace std;#define X 6#define Y 6int chess[X][Y] = { 0 };bool visited[X][Y] = { 0 };typedef struct state{ int x; int y;}STATE;STATE state[8] = //用来描述8个状态的切换{ { 1, 2 }, {

2018-01-01 14:24:48 233

原创 KMP算法原始版与优化

void GetNext(string pattern,int* &amp;next){ int length = pattern.length();    //*前后缀相等的长度越大意味着在该位置回退回去的距离越短,效率越低,next数组内的数字代表当前不匹配,用该数字索引对应的字符重新匹配 next = new int[length]; int k = -1, j = 0; //k代表...

2018-01-01 00:07:52 293

原创 汉诺塔问题的解决思路及算法

关于汉诺塔问题,好多时候当时理解了过段时间可能又会忘,其实这个代码很简单,主要还是分治思想理解不够透彻。架设3根柱子分别为A、B、C,圆盘数目为n。1:如果A有一个圆盘,则直接移动至c。2:如果A有2个圆盘,则A->B,A->C,B->C。好了这个时候已经可以解决问题了,结束条件为 n==1;假设当我们在数目为n-1的时候已经解决了移动问题可以成功移动至C,如果又多了一个呢,即

2017-12-31 21:25:27 19776

原创 floyd算法求多源最短路径

关于floyd三重循环的问题可能有人有疑问:为什么k要放在在外层循环,这个牵扯到动态规划的问题,状态转移方程为dist[k][a][b] = min(dist[k-1][a][k] + dist[k-1][k][b] , dist[k-1][a][b]),当多使用了一个中间节点k来更新ab间距离的时候,需要知道k-1的时候对应的所有的ab间距,才能推导出新增k节点之后的所有ab间距,所以要把k=1

2017-12-30 22:27:56 194

原创 图的存储(邻接表)创建与深度优先、广度优先搜索

#pragma once#include#includeusing namespace std;#define Vnum 10typedef int DATA;/*邻接表存储图*/typedef struct list //存储链表的结构{ int weight; //边 int index; //顶点数组的索引 struct list *nextList; //链表的

2017-12-30 20:22:01 850

原创 二叉树的存储,创建,以及四种遍历,删除

#include ;#include ;using namespace std;typedef char DATA;typedef struct BitTree{ DATA data; BitTree *lChild, *rChild;}BitTree, *BitNode;class CBitTree{public: BitTree* node; CBitTree()

2017-12-28 14:11:39 210

原创 归并排序算法理解

归并排序算法的思想:把一个序列拆分成一对序列,每个序列再次拆分,这样经过多次拆分,拆分成多个小序列,每个序列有2个以内的元素然后排序,再逐次把1对有序序列合并为一个有序序列,最后合并为一个完整的有序序列。void merge(int *data,int startIndex,int endIndex);void mergeSort(int *data,int startIndex,int

2017-12-27 13:59:57 190

原创 快速排序算法

快速排序算法的思想就是从数字序列中随便挑一个数,然后比跟剩余元素逐个比较,比它小的放在它的左边,比它大的放在它右边,然后这个数的位置就坐定了,然后分别取这个数左边的所有元素组成的新序列,还有右边的新序列,也就是左序列和右序列。用以上方法来递归实现。但是为了不浪费空间,总不能真的每个左序列和右序列都重新创建一个新的数组,可以通过记录原序列中的左序列右序列起始位置与结尾位置来实现,至于2个位置元素的交...

2017-12-27 12:56:09 107

原创 10进制转2进制问题

其实在计算机的逻辑里,只有2进制,10进制转2进制的意思是把计算机展示给我们的10进制(数字)转换为 2进制(字符串)。既然写转换,就写个优雅简洁的代码,号称史上最简(贱)。void ten2two(int num){ while(num) { cout<< (num & 1 ?1 : 0); num >>= 1; }}

2017-12-27 12:41:52 268

原创 关于矿泉水空瓶子和瓶盖兑换矿泉水的问题解决算法

问题大概描述:矿泉水1块钱1瓶,喝完以后,2个空瓶子可以换一瓶新矿泉水,4个瓶盖也可以换一瓶新矿泉水。问:花10块钱最后最多能得多少瓶矿泉水。钱不是问题,主要是考虑刚开始能买多少瓶矿泉水,这里是10瓶,既然写程序,就n瓶吧。大致思路如下:先把n个矿泉水全部拆分成空瓶和盖子,就是当前拥有的所有的空瓶和盖子。可以用while循环,结束条件是(经过一轮瓶子和瓶盖的兑换活动后)当前的兑换后

2017-12-27 12:08:57 6401

原创 dijkstra算法求单源最短路径

利用dijkstra算法求单源最短路径。

2017-12-26 18:52:19 433

空空如也

空空如也

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

TA关注的人

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