CORS(跨域资源共享)
CORS:一种基于HTTP头的机制,该机制允许服务标示除了它自己以外的其他源(域、协议、端口),使得浏览器允许这些源访问加载自己的资源
对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(例如 Cookie 和 HTTP 认证相关数据)。
若请求满足所有下述条件,则该请求可视为简单请求:
使用下列方法之一:
GET
HEAD
POST
除了被用户代理自动设置的标头字段(例如
Connection、User-Agent或其他在 Fetch 规范中定义为禁用标头名称的标头),允许人为设置的字段为 Fetch 规范定义的对 CORS 安全的标头字段集合
。该集合为:
Accept
Accept-Language
Content-Language
...
Git command
在本地创建仓库,并覆盖旧的仓库rm -rf .gitgit initgit add .git commit -m .git branch -M maingit remote add origin git@github.com:MisakeMikoto/blog.git(地址)git push -u origin main -f
Git 常用命令git initgit clone git addgit config # 配置信息git status # 查看文件状态git diff # 查看更新的详细信息命令git commit # 提交命令git reset HEAD # 取消缓存命令git rm # 删除git mv # 移动或者重命名
git configgit config --global user.name '你的用户名'git config --global user.email '你的邮箱'
git statusgit add <文件名> # 暂存文件git checkout <文件名> # 放弃未暂存 ...
树的算法
从零开始的算法学习(三)二叉树 class Node<V>{ V value; Node left; Node right;}
问题一
用递归和非递归两种方式实现二叉树的先序、中序、后序遍历
如何直观的打印一颗二叉树 ?
如何完成二叉树的宽度优先遍历 ?
左右节点(孩子)都为空的节点就叫做叶子节点
递归序
1 2 4 4 4(三次返回)2 5 5 5 2 (三次返回2)1 3 6 6 6 3 7 7 7 3 (三次返回7) 3 (三次返回3)1
在递归序的基础上,有三种遍历方式
先序:对于所有子树来说,都是先打印子树的头节点,在打印子树的左边节点,在打印子树的右边节点
1 2 4 5 3 6 7
第一次来到某个节点,就直接打印该节点,其他时候不打印
中序:对于每一颗子树,都是先打印左边节点,在打印头节点,在打印右边节点
4 2 5 1 6 3 7
第一次来到某个节点什么都不做,第二次来到某个节点打印该节点,第三次来到某个节点,什么都不做
后序:对于每一颗子树,都是先打印左边节点,在打印右边节点,在打印头节点
4 ...
链表的算法
可以认为无论Hash表存储多少数据,增删改查的时间复杂度都是常数级别O(1),但是常数时间比较大
如果Hash表存储是Key是基本类型比如:Interge,Double,String…那么Hash表内部传递的过程是按值传递的,在Hash表中所占的空间就是这个基本数据类型需要的空间(Hash表会拷贝一份值)
如果Key存储的不是基本类型,那么内部的传递过程是按照内存地址(引用)传递的,所占的空间一律是8字节
增删改查的时间复杂度是O(logN)
非基础类型的数在加入顺序表的时候,都需要把对应的比较器也一起传递过去
双指针
快慢指针
class Solution { public boolean isPalindrome(ListNode head) { ListNode slow = head, fast = head; int count = 0; while(slow != null){ count++; slow = slow.next; ...
图的算法
图的存储方式
邻接表
邻接矩阵
如何表达图?生成图?
图的表示方式很多,我们只需要熟练掌握一种,把这些图的代码写熟,以后遇到这种图的题之后,可以把这种图转换为我们熟悉的图结构
重点:用熟悉实现一种图的结构
图的宽度优先遍历
利用队列实现
从源节点开始依次按照宽度进队列,然后弹出
每弹出一个点,把该节点所有没有进过队列的邻接点放入队列
知道队列变空
广度优先遍历
利用栈实现
从源节点开始把节点按照深度放入栈,然后弹出
每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
直到栈变空
拓扑排序
先看哪个点是入度为0的点(入度为0的点一定是排在最前面的)
把A和A的边去掉,然后寻找下一个入度为0的点B
依次寻找所有入度为0的点,然后输出
最小生成树在保证连通性的前提下,总的权值最小
只要我们可以实现一种机制,实现集合的查询和集合的合并,那么就能很轻易的实现最小生成树的生成(并查集)
kruskal算法适用范围:要求无向图
prim算法适用范围:要求无向图
Dijkstra算法适用范围:没有权值为负的边(可以有权值为负数的边,但是不能有权值和为负数的环)
如果存在负数的边,可能导致 ...
GoLang(Linux/Old)
安装GO
官网下载最新版本的GoLang https://go.dev/learn/
解压到文件夹,设置环境变量
我使用的是ZSH,所以需要修改.zshrc文件,添加export PATH=$PATH:/home/arecuid/soft/go/bin
安装完成
简介Go的表达能力强、简洁、干净、高效。它的并发机制使其能够轻松地编写程序,从而最大限度地利用多核和网络机器,而其新颖的类型系统能够实现灵活和模块化的程序构建。Go可以快速编译成机器代码,但又具有垃圾收集的便利性和运行时反射的力量。它是一种快速、静态类型化的编译语言,感觉就像动态类型化的解释语言。
结构通常会设置一个GOPATH,所有的项目代码都放在GOPATH的src目录下
在GOPATH目录下创建三个文件夹
bin:用于存放编译后生成的可执行文件
pkg:用于存放编译后生成的归档文件
src:用于存放源码文件
在进行Go语言开发的时候,我们的代码总是会保存在GOPATH/src目录下。在工程经过go build、go install或go get等指令后, ...
算法分析 & 排序算法 & 位运算
常数操作:与数据量无关的操作
非常数操作:与数据量相关的操作
分析算法的好坏:先看时间复杂度的指标,在分析不同数据样本下的实际运行时间
比如同样的时间复杂度O(n).1000次的乘法运算和1000次的位运算,实际时间会有很大的差别
或运算 & 与运算 ^ 异或运算空间复杂度: 只需要常数个额外空间的空间复杂度为O(1)
需要额外空间的个数与数据量相关的算法的空间复杂度为O(n)
与运算(&):两个数同时为1,结果才为1,否则为0
可以用于清0,把一个数与0做与运算
取特定位置的数,把要取位置的数设置为1,其他位置设置为0,与代取数进行与运算即可
异或运算(^) : 相同得 1 ,不相同得0,还可以理解为不进位相加
或运算(|):两位中只要有1位是1,结果就是1
可以用于把某些位置置1,X = 1010 0000 ,设 Y= 0000 1111 X | Y = 1010 1111 把后四位置为1了
取反(~):0->1,1->0
异或运算的性质:1100 0011 0100 -> & 0100
0 ...
数组算法
数组二分查找二分查找的精髓在于寻找循环不变量,可以理解为有固定的含义,在处理的过程中绝对不会改变的量
二分查找服务的对象必须是有序的
二分查找的解题步骤
确定循环不变量,一般是数组的左边界和右边界
确定循环结束的条件,根据循环不变量的不同会有所改变
确定处理的逻辑
什么时候边界会改变?
要查找的是什么?
双指针法双指针法的精髓在于思考指针所表示的含义
通常有以下几种
一个指针用于遍历,另外一个指针用于收集遍历得到的数据,充当结果数组的边界
可以理解为,我们要从原来的数组中,剔除不符合要求的元素,保留符合要求的元素
不同的题目,对于双指针的操作并不相同,要根据不同的题目设计不同的逻辑
两个指针分别用于两种不同性质数组的划分
当划分为两个数组的时候,通常是解决合并的问题
要注意利用数组本身是有序的性质
不一定要从小到大,也可从大到小。
滑动窗口滑动窗口的精髓在于窗口的性质和窗口边界的变化
滑动窗口的解题步骤
确定窗口内装载的是什么东西,有什么性质
思考一种恰当的数据结构去记录这种窗口内数据的性质
确定什么时候窗口要移动
确定我们需要得到什么
模拟模拟的精髓在于模拟的 ...
Elasticsearch 进阶
首先导入hotel-admin 一个实现了对数据库数据增删改查的简易后台
本次的目标是,实现对后台数据库Crud的同时,保证ES内部的数据同步变更
明确主次关系,引起修改的主体是对数据库的Crud,通过使用消息队列技术来监听Crud,实现异步调用Es进行数据的更新
hotel-admin是Publisher,在对数据库进行crud的时候,要同步发送消息到队列
队列应该分开设计,可以使用topic交换机,分别声明,hotel.insert.queue和hotel.delete.queue队列
在添加/更新数据的时候rabbitTemplate.convertAndSend(MqConstants._HOTEL_EXCHANGE_,MqConstants._HOTEL_INSERT_KEY_,hotel.getId());
在删除数据的时候rabbitTemplate.convertAndSend(MqConstants._HOTEL_EXCHANGE_,MqConstants._HOTEL_DELETE_KEY_, ...
Elasticsearch基本操作
分布式搜索(Elasticsearch基础)
安装ES
之后还需要部署Kibana容器,因此需要让es和kibana容器互联,先创建一个网络
启动es
-e "cluster.name=es-docker-cluster":设置集群名称
-e "http.host=0.0.0.0":监听的地址,可以外网访问
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m":内存大小
-e "discovery.type=single-node":非集群模式
-v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录
-v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录
-v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录
--privileged:授予逻辑卷访问权
--network ...