刷题笔记-二叉树
刷题笔记-二叉树
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn
unordered_map、unordered_map底层实现是哈希表
顺序存储完全二叉树: 如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2
深度优先遍历(前中后序)一般通过递归实现, 也可通过栈使用非递归实现
广度优先遍历(层次遍历)一般通过队列实现
二叉树创建123456789101112131415public TreeNode CreateTree(Integer[] c) { if (size >= c.length) { return null; } Integer var = c[size++]; if (var == null) { return null; } TreeNode node = new TreeNode(var); Sy ...
关于计网的笔记
关于计网的笔记httpsTLS握手过程
Client Hello:报文中选项字段包含客户端支持的 SSL的指定版本和所使用的加密算法等
Server Hello: 根据客户端的加密组件筛选自己的加密组件发送, 发送 Certificate 报文。 报文中包含公开密钥证书。服务器同时还提供了一个用作产生密钥的随机数
Client Key Exchange: 证书可信, 客户端用随机数和 hash 签名生成一串对称密钥, 用 crt 公钥对对称密钥进行加密
服务端解密后回应
先三次握手建立TCP连接, 再TLS握手
1.2四次握手 1.3两次就可以
HTTPS 中的 TLS 握手过程可以同时进行三次握手必须满足两个条件
客户端和服务端都开启了 TCP Fast Open 功能,且 TLS 版本是 1.3;
客户端和服务端已经完成过一次通信。
三次握手SYN洪泛攻击
原理: 只有两次握手
客户端发送SYN后, 服务器收到后进入半开连接状态, 此时会为这次连接分配资源, 如果没有收到第三次握手, 会等待一段时间才释放资源
防止手段: SYN cookie
在二次握手时服 ...
一些有用的显示服务器信息的脚本
一些有用的显示服务器信息的脚本
ssh登录服务器的时候最先看到的便是一些欢迎的信息, 但默认的欢迎信息可以说是毫无用处, 我们便可以自行修改来展示一些有用的信息.
motdmotd, 全称Message Of The Day, 是Linux中发送问候消息的功能, 每次任意用户登录时都会触发motd服务的功能, 这个功能的脚本几乎都是使用root 权限来启动的
脚本位置在/etc/update-motd.d, 不想执行某些脚本, 可以直接取消执行权限
10-hostname-color类似于logo banner之类的东西, 比如Spring Boot项目启动后就会显示Spring Boot的logo
12#!/bin/bash/usr/bin/figlet "$(hostname)" | /usr/bin/lolcat -f
10-uname12#!/bin/shuname -snrvm
20-sysinfo123456789101112131415161718192021222324252627#!/bin/bash# get load averages ...
【狂神说Java】网络编程实战讲解
【狂神说Java】网络编程实战讲解tcpChat
客户端循环输入时不知道哪些东西该放进去, 如果不用os.close(), 字节只是写进了流中, 没有发送, 服务端接收不到, os.flush()也不行
client123456789101112131415161718192021222324252627282930313233package com.socket.TCPChat;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.util.Scanner;public class TCPClient { public static void main(String[] args) throws Exception { InetAddress serverIP = InetAddress.getByName("127.0.0.1"); int port = 9999; ...
【狂神说Java】注解和反射
【狂神说Java】注解和反射注解
12345678910111213141516171819202122232425262728293031323334package com.zq.Annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(value = {ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@interface MyAnnotation { String name() default "zq"; int age();}@Target(value = {ElementType.TYPE, ElementT ...
【狂神说Java】多线程详解笔记
【狂神说Java】多线程详解笔记线程状态
java类的方式
外部类: 在主函数所在的类的外部定义的类, 若是在同一文件, 直接new; 若是不同文件, 导包再new
静态内部类: 在主函数所在的类的内部且在主函数外部定义的类, 直接new
因为main是static, 所以他也要是static
局部类: 在主函数内定义的类, 直接new
匿名内部类: Interface o = new Interface(){类的定义}, 需先定义interface
lambda:
1234Runnable as = () -> { System.out.println("as");};as.run();
1new Thread(()->System.out.println("as")).start();
线程休眠sleepThread.sleep(1000);单位为毫秒
线程礼让yield
调用方式: 在线程内Thread.yield();
将线程由运行态转为就绪态, 此时重新决定 ...
zhou29笔记_nginx
nginx反向代理
正向代理:客户端向目标服务器发送请求,该请求被代理服务器拦截,由代理服务器向目标服务器发送请求,并将请求结果返回给客户端。客户端需配置代理服务器,代理的是客户端的请求。
eg:翻墙
反向代理:客户端向代理服务器发送请求,代理服务器根据策略将请求发给后台服务器,并将后台服务器返回结果发给客户端。反向代理服务器对客户端来说是透明的,客户端不需配置代理服务器,代理的是后台服务器
负载均衡
轮询(默认)
1234upstream bakend { server 192.168.0.14; server 192.168.0.15; }
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
1234upstream bakend { server 192.168.0.14 weight=1; server 192.168.0.15 weight=10; ...
zhou29笔记_java_IO流
字节流
字节流可以操作一切文件,读入字符文件注意编码;字符流专门操作字符文件,不用担心乱码
输入输出流是相对于程序来讲的,InputStream是父类,FileInputStream(文件字节输入流)和BufferedInputStream是子类;OutputStream同理
FileInputStream123File file = new File("C:\\Users\\86175\\Desktop\\Snipaste_2021-08-12_23-49-04.png");FileInputStream fis=new FileInputStream(file);FileOutputStream fos=new FileOutputStream("1.png");
fis.read();返回fis的一个字节intfis.read(bytes[] b);将fis中的从0到b.length的字节读到b中fis.read(bytes[] b,0,len);指定读的长度由于一个字节一个字节地读,效率很慢
fos.write(int b);将一 ...
zhou29笔记_java
变量作用域
局部变量:在类的方法内部
实例变量:定义在类中,不用初始化,使用的时候先实例化类,再用对象. 成员名的方式访问
类变量:在类中,用static修饰,可以直接在本类中使用,也可以用类名.成员名的方式在其他类访问
变量命名规范
所有变量、方法、类名:见名知意
类成员变量:首字母小写和驼峰原则
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线: MAX_VALUE
类名:首字母大写和驼峰原则
方法名:首字母小写和驼峰原则
两个数据类型相操作,如果两类型最大是int(可以没有int),结果是int
如:
1short a=2; byte b=1; //则a+b是int
如果两类型有long或double,则为long或double。
即使用一个更大的类型去接收,也不行
如:
123int a=2000000000;//20亿int b=10;double c=a*b; //c依然不是200亿(溢出后的结果)
使用 double c=(double)a*b 可以解决
123int a=1;int b=2;System.out.println(" ...
zerotier moon中转节点+nat访问局域网
zerotier moon中转节点+nat访问局域网入轨12zerotier-cli join ...zerotier-cli orbit 5759192bd3 5759192bd3
nat