谜一样的奶牛
题目描述
解题思路这个题目如果是从前往后找规律是很难找的,我们需要从最后一头牛看起,我们知道,最后一头牛只要知道了前面有多少比她小的,因为我们牛的编号只能是1-n,所以我们可以判断出最后一头牛的身高。判断了最后一头牛的身高之后,我们可以判断倒数第二头牛的身高。我们维护一个身高数组,从后往前枚举牛,只要确定了某头牛的身高,那么身高数组对应身高置0,否则是1。目前我们枚举到的牛前面有k个比她小,那么我们只需要找到身高数组1-m的前缀和为k就好,这头牛的身高就是m+1。查找可以二分优化。
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import java.io.*;import java.util.*;class Main{ public static int N = 100010,n; public static int[] cows = new int[N],lower = new int[N],c = new int[N],res = ...
树状数组
树状数组当我们涉及到求前缀和的情况下,我们很容易想到求前缀和数组,然后以O(1)的时间复杂度求出某一区间的元素之和。但是如果我们修改了数组中某一个点,那么我们就需要O(n)的情况下来维护前缀和数组。如果涉及到了需要修改数据并且查询区间和的需求,我们的前缀和算法涉及到的时间复杂度就是O(n^2),这个时候我们引入树状数组来解决问题,树状数组就是借鉴了前缀和的思想,将维护从O(n)下降到O(logn),将查询从O(1)上升到O(logn),那么最后的时间复杂度就是O(nlogn)。这是一个相对来说比较平衡的方法。说白了就是单点修改,区间查询。
前置概念树状数组主要是参考的二进制优化和前缀和的思想,如果我们需要求数组前1-n个元素的和,我们可以将这些分成一部分一部分。每一部分都记作C数组。这个数组在树状数组中是以树状来表示的。现在听起来可能很抽象,可以带着疑问往后看。n可以表示为二进制,如下:
$$n = 2^{x_1} \times 2^{x_2} \times 2^{x_3} \times …\times 2^{x_{k-1}} \times 2^{x_k} (x_1 > ...
验证码
验证码解决方案传统web解决方法后端生成验证码,并且将验证码存入session,前端发起登录请求,在UserNamePasswordAuthenticationFIlter之前添加一个校验验证码的过滤器,在验证用户名和密码之前校验验证码。
因为这个项目我实现的是前后端分离项目,存在前端每次请求sessoinId不一样的情况。故这个代码就省略了,可以参考后面前后端分离的代码,只不过是用Redis存储了我们校验码而已。
前后端分离解决方案在这个方案中,省略掉Spring Security,Redis和MyBatis-plus相关代码,用户名和密码校验可以参考Spring Security(一):用户授权实战 。
kaptcha
引入依赖
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364<dependencies> <dependency> <groupI ...
Spring Security(一):用户授权实战
Spring Security(一):用户授权实战这一篇文章主要循序渐进的总结一下使用Spring Security进行jwt登录的实战。
默认授权(入门案例)代码
创建SpringBoot项目
引入Spring Security 依赖
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
启动项目之后会自动拦截跳转登陆页面,用户名默认是user,密码在后台每次都会动态生成。
简单原理Spring Security的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案主要的过滤器。
UsernamePasswordAuthenticationFilter: 负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
**Excepti ...
jwt
JWT (JSON Web Token)(1) JWT简介什么是JWT
JWT是一种基于 Token 的****认证授权机制.
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。
JWT有什么用
JWT最常见的场景就是授权认证,用户登录之后,后续的每个请求都将包含JWT, 系统在每次处理用户请求之前,都要先进行JWT的安全校验,通过校验之后才能进行接下来的操作.
JWT认证方式
JWT通过数字签名的方式,以JSON对象为载体,在用户和服务器之间传递安全可靠的信息.
首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)。 ...
奇偶游戏
题目描述
解题思路这个题目使用到前缀和的思想,我们l-r中有奇数个一,就说明,s[r] - s[l-1]是奇数,同样说明s[r]和s[l-1]奇偶性不同。如果是偶数的话那就说明相同。在这里我们的奇偶性判断是双向传递性质的,我们可以使用并查集来维护每个节点是不是相对于同一个点奇偶性相同(需要在同一集合)。异或操作就是没有进位的加法
l r even :
l 和 r在同一集合 ,如果((d[l] + d[r]) % 2 == 1) => d[l] ^ d[r] == 1那么就出错;
l 和 r不在同一集合,需要满足(d[l] + d[r] + ? ) % 2 == 0) =>(d[l] ^ ? ^ d[r]) % 2 == 0。? = d[l] ^ d[r]。
l r odd :
l 和 r在同一集合 ,如果((d[l] + d[r]) % 2 == 0) => d[l] ^ d[r] == 0那么就出错 ...
银河战舰传说
题目描述
思路类似我们统计每个并查集集合的思路,计算我们的每个点距离根节点的距离的时候。我们只需要在需要加的集合,每个集合里面都加上被加上集合的size。我们只需要给被加上集合的根节点加上size就好了,在每次查询距离根节点的距离的时候,我们更新查询节点的d数组就好了。
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import java.io.*;import java.util.*;class Main{ public static int N = 500010; public static int[] find = new int[N],size = new int[N],d = new int[N]; public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static Buff ...
程序自动分析
题目描述
思路
首先这个题目判断顺序不会影响最终答案,可以先判断所有等式,再判断所有不等式,只要有不等式不成立那就是错误。(相等:在同一集合,不相等:在不同集合)
因为数据范围是1E9,会超过限制内存。我们需要做一个哈希来映射。
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import java.io.*;import java.util.*;class Main{ public static int N = 100010,P = N*2 - 1; public static Option[] os = new Option[N]; public static int[] hash = new int[N*2],find = new int[N*2]; public static Scanner ...
日志使用
SpringBoot 日志实战1 日志框架分类与选择1.1 日志框架的分类
日志门面 (日志抽象)
日志实现
JCL(Jakarta Commons Logging) SLF4J(Simple Logging Facade for Java)
Jul(Java Util Logging) , Log4j , Log4j2 , Logback
记录型日志框架
Jul (Java Util Logging):JDK中的日志记录工具,也常称为JDKLog、jdk-logging,自Java1.4以来的官方日志实现。
Log4j:Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。
Log4j2:一个具体的日志实现框架,是Log4j 1的下一个版本,与Log4j 1发生了很大的变化,Log4j 2不兼容Log4j 1
Logback:一个具体的日志实现框架,和Slf4j是同一个作者,但其性能更好(推荐使用)。
门面型日志框架
JCL:Apache基金 ...
easypoi使用
使用easy_poi完成excel表的传输easypoi介绍EasyPoi是一个基于Apache POI的Java Excel导入导出框架,它可以帮助开发人员快速、方便地实现Excel文件的导入和导出功能。EasyPoi提供了丰富的API和注解,使得操作Excel变得简单而高效。
@Excel注解参数
属性
类型
默认值
功能
name
String
null
列名,支持name_id
needMerge
boolean
fasle
是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNum
String
“0”
列的排序,支持name_id
replace
String[]
{}
值得替换 导出是{a_id,b_id} 导入反过来
savePath
String
“upload”
导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/
type
int
1
导出类型 1 是文本 2 ...