滑动窗口问题
滑动窗口问题滑动窗口主要解决子数组或者子串问题,其优点是可以避免暴力算法导致的O(n²)的时间复杂度,降低时间复杂度到O(n)。
滑动窗口的代码模板如下:
123456789101112131415161718192021222324252627282930313233343536# 滑动窗口算法框架def slidingWindow(s: str): # 用合适的数据结构记录窗口中的数据,根据具体场景变通 # 比如说,我想记录窗口中元素出现的次数,就用 map # 我想记录窗口中的元素和,就用 int window = dict() left = 0 right = 0 while right < len(s): # c 是将移入窗口的字符 c = s[right] window[c] = window.get(c, 0) + 1 # 增大窗口 right += 1 # 进行窗口内数据的一系列更新 #... #/** ...
为什么Cookie无法防止CSRF攻击而Token可以?
为什么Cookie无法防止CSRF攻击而Token可以?CSRF介绍CSRF(Cross Site Request Forgery):跨站请求伪造,属于网络攻击领领域范畴。相比于SQL脚本注入、XSS攻击等安全攻击方式,CSRF的知名度并没有他们高,但是它确实是我们开发系统时必须要考虑的安全隐患。
什么是CSRF呢?
简单来说,就是黑客利用你的身份信息去做一些非法的事情,例如将你的钱转走、发邮件、发消息等
CSRF攻击需要依赖于Cookie,Session
Cookie中会存放SessionID,
CSRF攻击流程流程:
客户端通过账户密码登录访问网站A
网站A验证客户端的账号密码,成功则生成一个sessionID,并返回给客户端存储在浏览器中
该客户端Tab一个新页面访问了网站B
网站B自动触发要求该客户端访问网站A(网站B中有链接指向网站A)
客户端通过网站B中的链接访问网站A(此时携带有合法的SessionID进行访问站A)
此时网站A只需要校验sessionID是否合法,若合法则执行相应的操作
防御方法防御CSRF攻击的方法:
在请求地址中添加token并验证
验证 HT ...
八股整理
1.redis的集群模式
2.redis的持久化策略
3.内存淘汰策略
4.redis hash的底层结构
5.redis string底层结构
6.redis实现分布式锁,以及setnx可能存在的问题
7.spring和springboot的区别
8.springboot注入类有哪些注解,有什么区别
9.spring aop如何实现
10.动态代理有几种实现方式
11.mybatis #和$的区别
12.mysql如何选择建立哪些索引
13.mysql为什么用b+树
14.mysql有哪些锁
15.https中用到了哪些加密算法
16.tcp的粘包问题
17.linux如何查看文件
18.java锁的可重入和公平性
19.java线程的生命周期
20.wait和sleep的区别
21.什么是死锁,如何用java写个死锁
22.jvm的内存模型
23.年轻代垃圾回收算法
24.树的遍历
25.一致性哈希算法
26.编程题,字符串匹配,说可以直接暴力
二面
1.介绍部门业务
2.拷打项目
3.数据库事务的特性
4.如何实现持久性
5.binlog和redolog的区别
6.undolog ...
Java与Python对比
Java语言与Python对比语法和风格Java是一种静态类型语言,所有的变量都需要显示的提前声明,并且有严格的语法和规范;
Python是一种动态类型语言,所有的变量类型都是在运行的时候才确定的,语法更加简洁和灵活
性能Java作为一种编译型语言,性能比较高;而Python作为一种解释型语言,其性能会比较慢。这一点从我平时在leetcode上刷题就可以看出来,相同的实现方式,往往Java速度会更快一些。
并发和多线程的支持Java中提供了完善的并发和多线程的处理能力;而Python由于全局解释器锁的原因,多线程并不能真正实现并行执行,更适合用于I/O密集型任务。其在处理CPU密集型的任务的性能不如Java
应用领域Java往往应用于例如服务器端开发、大数据处理和安卓领域
Python更多的用于科学计算、人工智能领域以及一些简单的web开发
生态系统和库二者生态系统都挺完善的,Java有例如Spring一系列的框架,Python也有诸如Django、Flask、FastAPI、Numpy、pandas等框架;二者的社区都很活跃。
面向对象Java是单继承的,但是可以通过实现接口的方式弥 ...
Ubuntu20.04安装FloodLight最新版本
Ubuntu20.04安装FloodLight最新版本
网上的很多教程尝试了一下都不对,并且很多都是基于Ubuntu14的旧版本系统,其中的Python环境大多是基于2.0的,由于本人所使用的系统是Ubuntu20.04,后再油管澳大利亚某个学校的网络教学视频的帮助下成功安装,在这里写下安装教程,希望能对后面学习的同学有所帮助。
系统环境:Ubuntu20.04
Python版本:3.8
第一步:安装必要的依赖文件这里网上的教程会让下载python-dev,注意不要下会将系统中原有的Python3.0的版本给修改导致Mininet无法运行。
1sudo apt install build-essential python-dev openjdk-8-jdk maven ant
第二步:下载FloodLight1git clone https://github.com/floodlight/floodlight.git
第三步:安装web子模块安装web子模块
123cd floodlightsudo git submodule initsudo git submodule up ...
SpringBoot项目快速搭建
快速创建SpringBoot项目
打开IDEA在File->New->Project中新建项目
点击左侧的Spring Initializr
输入以下信息:
Name 项目名称
Group 根据公司域名来,或者默认com.example【倒序域名】
Package Name 包名,项目的代码会在这个包下
JDK版本
Java 与上面JDK版本对应
点击Next,选择SpringBoot版本,注意JDK17仅支持SpringBoot3的版本,不支持2.0版本,然后因为我们需要开发web项目,所以需要勾选Web下的Spring Web,之后点击Create
等待片刻,即可完成项目脚手架的创建。
项目结构如下:
我们主要关注的是:
pom.xml:这里面是关于项目中所使用到的依赖坐标
application.yml:关于项目中的一些配置信息,如数据库配置、Redis配置等
我们在springbootquickstart包下创建controller文件夹,并在其中创建一个HelloController对象
123456789101112package com.ex ...
Centos服务器安装MySQL
Centos服务器安装MySQL
利用闲置服务器安装MySQL,用于项目练手
Linux版本:Centos7.9
MySQL版本:8.0.36
一、下载MySQL从Oracle官网下载最新版本的MySQL
1wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar
在 /usr/local/src目录下创建一个mysql目录,进入目录后将下载的mysql解压到mysql目录下
12mkdir /usr/local/src/mysqltar -xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar -C /usr/local/src/mysql/
二、安装1yum install -y perl.x86_64
在mysql目录下执行yum安装命令,等待跑完安装成功
1yum install -y mysql-community-*.rpm
显示Complete!即为安装成功
三、启动1systemctl start ...
Springboot学习笔记
Springboot学习笔记基础篇配置文件采用.yml格式的配置文件相较于.property格式的配置文件来说,层级关系更清晰
yml配置信息的书写与获取
三方技术配置信息
Mybatis
自定义配置信息
邮件的相关配置信息
使用注解进行值的获取
1@ConfigurationProperties(prefix = "email")
注意:
值的前面必须有空格作为分隔符
使用空格作为缩进表示层级关系,相同层级左侧对齐
配置信息的获取
1234// 获取值@Value("${键名}")// 前缀@ConfigurationProperties(prefix = "email")
Springboot整合mybatisBean注册
如果要注册的bean对象来自于第三方(不是自定义的),是无法使用@Component及其衍生注解声明bean的
@Bean
@Import
Bean扫描
Springboot默认扫描启动类所在包及其子包下的内容,如果要扫描其他文件夹,可以手动添加注解@ ...
三次握手与四次挥手
TCPTCP是一种面向连接的协议,可以保证传输的可靠性
TCP是一种全双工的协议
三次握手三次握手的流程
为什么是三次而不是两次首先客户端给服务器端发送请求之后,当服务器端收到请求就可以确保客户端的发送功能是正常的
然后服务器端给客户端响应(seq=y, ack=x+1),当客户端收到消息之后,就可以确保服务器端的发送和接收功能都是正常的
此时客户端再给服务器端发送一条响应,那么服务器端就可以确保客户端的接收功能也是正常的。
如果说只进行两次握手,客户端给服务器端发送Hello,服务器端给客户端回一个hi,可能存在一个问题,这个消息并没有被客户端所接收,连接可能会存在数据丢失导致不可靠的问题。
四次挥手TCP通过四次挥手来保证数据完整传输的
四次挥手需要确保双方后面都不会再发送数据的情况下再进行断开连接
过程:
客户端给服务器端发送一个带有FIN结束标识和seq=1的断开连接的请求包,主要目的是告诉客户端我这边不再发送数据包了,但是可以接收数据。
服务器端会给客户端发送一个ack包,表示自己已经知道客户端不会再向自己发送数据了
服务端给客户端发送一个断开连接的请求包,告知客户端自己这边 ...
Python内置模块collections解析
Python内置模块collections解析python的collections模块提供了非常多方便的操作,例如
Counter
defaultdict()
OrderDict()
deque
双端队列
namedtuple()
下面将逐个介绍每一个具体类的用法
Counter类该类可以快速的进行统计,例如给定一个字符串之后,可以统计每个字符出现的次数,当然只要是可迭代【可哈希】的数据都是可以传给Counter中的,例如list,tuple等
12345from collections import Counterstring = "abcdeasdasdkjyhaksjdhkashd"myhash = Counter(string)print(myhash)
该类中提供了几个方法可以使用
most_common()
可以将字典中的元素按照出现次数组成一个元素,再按照出现次数从大到小排列成一个列表
例如:[(‘a’, 5), (‘d’, 5), (‘s’, 4), (‘k’, 3), (‘h’, 3), (‘j’, 2), (‘b’, 1), ( ...