- 博客(117)
- 收藏
- 关注
原创 递归进阶(Java)
素数环:给定一个正整数n,求1~n的所有排列中,让这n个数围成一个圆,满足相邻两个数之和为素数的排列个数,输出从1开始,逆时针排序。问题:现在有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组成一个给定数值n,问多少种组合方式。当L=3时,字符串是由abc组成,前7个困难的串是:a,ab,aba,abac,abaca,abacab,abacaba。二进制法:数组a,大小为n,其有2的n次方-1个非空子集,n个元素转为n的二进制位,1代表选,0为不选。每种面值硬币的数量不限。
2025-02-16 14:08:49
244
原创 有关质数的简单算法问题(Java)
问题:用欧拉函数,求1~n中与n互质的数的个数,n为a的b次幂,a<=10^9,b<=10^18,结果会很大,结果对mod=998244353取模。解法:求求1~n中与n互质的数的个数,即求n的欧拉函数,a的欧拉函数 乘 a的b-1次幂 即为所求 a的b次幂的欧拉函数。解法:埃氏筛法:预处理一张表,i从2开始遍历,每次遍历i,从表中除去所有的i的倍数。定理:在1~x范围内,大体有 x/(ln x)个素数。问题: 素数筛法 ,求第k个素数,或者某个范围内素数的个数。例子:求底k个质数,从2开始。
2025-02-16 09:43:12
216
原创 欧几里得算法求最大公约数 与 贝祖等式 与 求组合数(Java)
所以 bx1 + (a%b)y1 = m转换为 m = bx1 +(a-(a/b)*b)y1 = ay1 + b(x1-a/b*y1) 注意:此时 a/b*b!y=y1-k(a/d) ,a/d为y的变化幅度。且gcd(B,9973)=1。ax≡1(mod m) 即ax%m=1,转换为 ax + my = 1,当且仅当gcd(a,m)=1时有解,这时求出的x为a对模m的乘法逆元。设该物为x,x%3=2 ,x%5=3,x%7=2 -> x≡2(mod 3),x≡3(mod 5) x≡2(mod 7)
2025-01-21 17:08:11
742
原创 Nim游戏算法问题(Java)
解法:先按位置进行升序排序,从后往前把棋子俩俩绑定,下标为17和21的绑定,下标为13和下标为9的绑定。从左到右有一排棋子,给定棋子的位置,规定每个棋子只能向左移动,且不能跨过前面的棋子,最左边的棋子最多移动到下标为1位置,所以,A先手,如果行动前,结果为非0,就可以行为后变为0,赢了;同一对棋子中,对手对前一个棋子移动若干步数,你总能对后一个棋子移动相同的步数,所以俩对棋子之间的间距没有影响。一共有n堆石子,编号为1~n,第i堆石子有a[i]个石子,Nim变体:Staircase Nim阶梯Nim博弈。
2025-01-21 16:13:14
191
原创 进制解决天平秤重问题(Java)
所以转变 (1 2) 对低位的2+1 -> (2 0) 然后在减一恢复大小-> (2 -1) 然后同样对低位2加1然后在减1 -> (1 -1 -1) 也就是砝码9 -3 -1 ,大于0的与小于0的放在不同的盘中。解法:比如5 转为3进制-> (1 2) 是一个重量为3的,2个重量为1的,但每种砝码只有一个,需要转变,将不是1的位变为1,直到所有位都为1或者-1或者0。先给定重量,求出对应的砝码的组合方案,重量<1000000。问题:天平称重尽可能用少的砝码称出更多的重量。
2025-01-21 16:02:07
217
原创 字符串常见简单问题(Java)
给定一段产品的英文描述,包含M个英语单词(w1,w2,w3,w4,...wm),每个英语单词以空格分割,无其他标点符号。在给定N个英文单词关键字(p0,p1,p2),找出描述中包含N个关键字(每个关键字最少出现一次)的最短子串,扫描描述,直到扫描到全部的N个关键字结束。问题:字符串的简单压缩,比如字符串:“aabccccaaaa”压缩为a2b1c5a4,若压缩后字符串没有变短,则返回原字符串。问题: 给定俩个字符串,请确定其中一个字符串的字符重新排序后,能变为俩一个字符串。不能,返回false;
2025-01-14 15:23:32
207
原创 矩阵简单问题(Java)
然后按列求和,维护一个sum数组,sum[i]为第i列的元素求和,先是从第0行到最后一行的所有列求和,每加一次,求一次sum数组的最大子序列。然后在清空sum,然后在是第1行到最后一行的所有列求和,每次求和,求一次sum数组的最大子序列,然后在从第2行开启,直到遍历完所有行。解法:将矩阵中每行的相同列的元素逐渐相加,转化为 无序的一维数组求最大连续累加和。问题:求最大子矩阵累加和,其值有正、有负、有0,返回子矩阵的最大累加和。给定一个n*n矩阵,值只有0和1 返回边框为1的最大正方形的边长长度。
2025-01-02 14:24:33
510
原创 计数排序与基数排序(Java)
基数排序 也是通过分配和收集过程实现排序,对于十进制数来说,每一位数在[0,9],d位的数,则有d列,基数排序首先按低位有效数进行排,然后逐次向上位进行排序,直到最高位排序结束。计数排序:用辅助数组对数组中出现的数字进行计数,元素转下标,下标转元素。n为数组长度,k为数组中元素的最大值,时间快,空间浪费率高。约定:待排数字中没有0,没有负数(有负数,做一次转换全部变为正数即可)。假设元素都大于0,扫描数组,将元素值k记录在辅助数组下标k位上,计数1。然后扫描辅助数组,若该位置值为1,则依次回填数组中。
2024-12-30 13:21:49
179
原创 堆排序(Java)
若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。二叉堆特征:1、父节点的键值总是大于或等于(小于或等于)任何一个节点的键值;2、每个节点的左子数和右子树都是一个二叉堆。二叉树:可以用数组来表示一棵数,如果已经根节点的下标为i,那么它的俩个子节点下标分别为2i+1和2i+2。任意节点的值都大于其子节点的值--大顶堆;任意节点的值都小于其子节点的值--小顶堆。二叉堆是完全二叉树,或者近似完全二叉树。
2024-12-30 12:51:16
321
原创 排序算法简单问题(Java)
解法:类似于归并数组,把数组前后分为俩部分,然后不断细分,直到剩俩个元素,然后升序排序,然后在对俩部分数组a(前半部分),b(后半部分)中第一个数进行比较,如果b小,那么b数列中的这个元素拥有a数组中元素个数 个逆序对 ,每次比较取走最小的。选取一个元素作为主元素,判断主元素的值是否等于其下标值,若等于,则所求在右侧,若主元素值大于其下标则所求在左侧,主元素值不可能小于下标值。那此题目,在不允许挪动数组中元素的位置的情况下,缩小次数,出现次数最多的元素的出现次数恰好为数组长度的一半呢?
2024-12-30 12:42:47
494
原创 快排与归并排序
当扫描指针逐右扫到比主元素大的元素就跟末指针指的元素交换位置。快排重点在于划分,将原数组A根据某一下标q划分为俩个子数组,其中右边数组中的任意一个元素都大于等于A[q],左边数组的任意一个元素都小于等于A[q],这样就不需要合并了。将原数组简单的划分为俩部分,对俩部分进行排序,然后用俩个指针分别指向俩个子序列的最小值处,比较后,放小的元素放入一个新的数组中,然后小的指针右移。双向扫描法:头指针往后扫,找到第一个比主元素大的元素,末指针从末尾往前扫,找到第一个比主元素小的元素,然后交换位置。
2024-12-26 16:56:33
537
原创 递归算法常见问题(Java)
解法:每一个数都为前俩个数之和,第1项和第2项都为1,所以写 方法f1(n)即为求第n个数,那么f1(n-1)为求第n-1个数,f(n-2)为第n-2个数。所以f1(n)=f1(n-1)+f1(n-2),然后设置出口,n=1或者n=2时返回1。等价于:将1~N-1从a移动到b,将N移动到c,这时a为空,c为空(此时c有N但因为N不用动了,所以看作为空),然后在把1~N-1移动到c,a为辅助。上第n阶时,有三种情况,它可以从第n-1阶上1阶、从第n-2阶上2阶、从第n-3阶上3阶。
2024-12-26 15:37:50
385
原创 位运算常见简单问题(Java)
解法:把1逐次往左移,与运算,只要比对位不为1结果就为0:将该数减1,那么最低位的1会变为0,其后面低位的0会全部变为1,比如:1010 1000 -1=1010 0111,然后将俩者与运算就会把原数最低位的1消除掉,1010 1000 & 1010 0111 =1010 0000,不断减一,与运算直到原数为0。解法:1、假如这11个数为 {1,2,3,4,5,6,6,7,8,9,10},将这11个数进行异或,结果是除重复数6外的所有数的异或值,相同数进行异或结果为0。问题:判断某个数是否为2的整数次方。
2024-12-26 15:00:45
448
原创 AutowiredAnnotationBeanPostProcessor bean后处理器运行分析
我们先创建一个AutowiredAnnotationBeanPostProcessor的实现类,然后设置它的beanFactory属性,因为@Autowired是根据属性或方法的类型去找到要注入的对象,beanFactory能找到该对象,所以需要设置beanFactory。根据Bean1类中成员变量名获取该类中的成员变量的类型,然后把bean3类型封装为DependencyDescriptor对象,在metadata内部会调用beanFactory的方法 ,根据成员变量的类型去找要注入哪个对象。
2024-12-15 16:55:04
786
原创 bean后处理器的作用
实际开发中我们还可能遇到这样的需要:用@ConfigurationProperties注解根据前缀和类中的属性名称去匹配配置环境中的信息,比如:javax.home java.version属性读取出来赋值给类中的属性。在Bean1类中我们分别用@Autowired注入Bean2,@Resource注入Bean3,@Value注入环境变量中的端口号,@PostConstruct注入初始化,@PreDestroy注入销毁。Bean后处理器的作用:为Bean生命周期各个阶段提供扩展。
2024-12-14 15:59:36
485
原创 bean的生命周期
可以看到执行顺序依次是:bean的构造方法、bean注入方法、初始化、销毁。其实,还有很多bean后处理器,提供bean生命周期各个阶段的扩展。
2024-12-13 13:54:11
189
原创 常见的四个ApplicationContext实现类
第三个实现类:较为经典的容器,基于Java配置类来创建 (注解),创建的后处理器都已经加载好了,实现类AnnotationConfigApplicationContext。第一个实现类:较为经典的容器,基于classpath类路径下的xml格式的配置文件来创建,实现类:ClassPathXmlApplicationContext。第二个bean:DispatcherServlet是浏览器请求的最终入口,就是浏览器的请求最终都是经过该入口进入服务端的。在配置类中用@Bean注入Bean1和Bean2。
2024-12-13 13:34:41
466
原创 beanFactory实现演示
其实beanFactory解析注解的功能是由其他的类实现的,我们需要用跟注解相关的工具类去给beanFactory添加一写beanFactory后处理器,后处理器即对beanFactory功能的扩展,具备解析bean注解的能力。注意:bean的后处理器有多个,所以bean后处理器有排序的逻辑,根据加载bean后处理器的顺序决定谁的优先级高,先加载到beanFactory中的优先级高。bean是延迟实例话的,只有用到的时候才会去创建,并不会提前创建,都是临时创建的。
2024-12-11 19:52:53
589
原创 BeanFactory与ApplicationContext的功能
beanFactory:是ApplicationContext的父接口,是spring的核心容器,主要的ApplicationContext实现都需要它的功能。图中可知ApplicationContext是ConfigurableApplicationContext的父接口,而beanFactory是顶层的父接口,所以ApplicationContext的功能也比beanFactory的功能多。因为这方法是私有的,debug的话实例太多不好看,可以通过反射拿到该map集合,看看其中的单例。
2024-12-11 17:35:52
903
原创 springSecurity权限控制
在数据库中,我们会创建一个用户表,一个权限表(记录着权限功能说明和权限名),一个用户可以有多个权限,不好表达,所以我们又引入了一个角色表,里面有很多角色,在创建个角色权限管理表,每种角色对应不同的多种功能,为角色赋予不同的权限。那么SecurityContextHolder中的权限信息是从哪里获取的呢,前面SecurityContextHolder中的认证用户信息是从redis中获取的,权限信息也一样。我们能用的权限控制注解有很多,但真正经常用的只有@PreAuthorize就是在访问之前进行权限判断。
2024-12-08 13:32:47
951
原创 springSecurity自定义登陆接口和JWT认证过滤器
在登陆service层接口中需要通过AuthenticationManager的authenticate方法进行用户认证,我们先在SecurityConfig中把AuthenticationManager注入容器。authenticationManager的authenticate方法需要一个Authentication实现类参数,所以我们创建一个UsernamePasswordAuthenticationToken实现类。图中的 5.1步骤是到内存中查询用户信息,而我们需要的是到数据库中查询。
2024-12-08 13:04:49
712
原创 springSecurity认证流程
在登陆时,前端会把用户输入的用户名和密码传给后端,后端根据用户名去数据库查询,若有该用户并且密码正确则认证通过,然后根据userId生成jwt,把jwt传给前端。启动后,在浏览器访问 http://localhost:8080/hello 访问该接口时会自动跳转到一个springSecurity默认的登陆界面,默认用户名为user,密码会输出在控制台。下面是springSecurity实现认证流程的一个案例(springSecurity有很多不同的实现方法,但几乎都差不多,看懂一个其他的就也能看懂了)
2024-12-08 12:31:04
661
原创 nginx实现负载均衡
大多的域名注册商支持对同一个主机名添加多条记录,就是一个域名可以绑定多个IP地址,这就是DNS轮询,DNS服务器按照一定顺序,把请求随机分配到不同的IP上,实现简单的负载均衡。backup:预留的备份服务器,当主服务器不可用时,将用来处理请求,代替主服务器。5、url_hash url分配:按url的hash结果分配请求,使每个相同的URL定向到同一个服务器,配合缓存命中使用。数据包在底层分发,不识别域名,效率比7层的高。七层负载均衡指的是OSI中的应用层,基于虚拟的URL或主机IP负载均衡。
2024-12-01 16:49:14
467
原创 nginx安全控制
语法:ssl_prefer_server_ciphers on|off 默认:ssl_prefer_server_ciphers off。需要再次设置一个密码,我用的itcast。然后说明你的一些信息:国家,省份,地区,组织,组织单元,名字,邮箱,然后输入密码和公司名。语法:ssl_sesstion_timeout time 默认:ssl_sesstion_timeout 5m;nginx想使用SSL,需要--with-http_ssl_module 而该模块默认没有添加,需要重新编译添加。
2024-12-01 16:37:09
578
原创 nginx反向代理
默认值:proxy_set_header Host $proxy_host;proxy_set_header:可以更改接收到的客户端请求的请求头信息,然后将新的请求头发送给代理服务器。这里需要代理服务器和被代理服务器,因为设备限制,我这里用一台服务器的不同端口来配置代理服务器和被代理服务器。proxy_pass:用来设置被代理服务器的地址,可以是主机名、ip端口形式。代理服务器:格式:proxy_redirect 需要隐藏的IP 替换结果IP。默认:proxy_redirect default;
2024-12-01 16:24:47
364
原创 nginx 之 rewrite功能配置
regex:为匹配的正则表达式。如果该字符串是以“http://”或者“https://”开头,则不会继续向下对URI进行其他处理,而是直接返回重写后的URI给客户端。3、 break:用于中断当前相同作用域中的其他nginx配置,与该指令属于同一作用域的nginx配置,在该指令前的生效,后面的失效。执行break后,终止匹配,如果没配置的话,会默认重定向到html/testbreak目录(即location后面的路径),但这个目录是不存在的,所以会报404,随便该目录下创建一个html文件就可以了。
2024-12-01 16:10:59
1061
原创 ngixn跨域问题
学习防盗链之前先学习一个http的头信息Referer,当浏览器向web服务器发送请求的时候,一般都会带上Referer,来告诉浏览器该网页是从哪个页面链接过来的。解决:add_header指令,需要添加俩个头信息,一个是Access-Control-Allow-Origin,一个是Access-Control-Allow-Methods。Access-Control-Allow-Methods:允许跨域访问的请求方式,值可以为get、put、post、delete等,可以全部设置,多个之间逗号间隔。
2024-11-25 14:24:43
324
原创 nginx静态资源压缩
可以用ngx_http_gzip_static_module模块的gzip_static指令来解决。nginx配置文件中可以配置gzip指令来对静态资源进行压缩,nginx通过ngx_http_gzip_module模块、ngx_http_gzip_static_module模块、ngx_http_gunzip_module模块对这些指令进行解析和处理。.gz文件就是压缩文件。gzip_comp_level指令:用于设置gzip的压缩程度,级别从1到9,1为程度最低,9为最高但效率最低,最费时。
2024-11-25 14:20:36
793
原创 nginx静态资源优化配置
三个指令都开的好处:sendfile开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分填满,大大减少了网络开销,并加快了文件传输的速度。客户端请求welcome.html后发送请求到服务端,应用程序发送read命令给操作系统,然后操作系统先把磁盘的信息拷贝到内核缓冲区,在copy到应用程序缓冲区,然后应用程序在发送write命令给操作系统,把应用程序缓冲区的内容copy到socjet缓冲区,在copy到网卡,最后发送给客户。其中多次copy和进程切换,性能较低。
2024-11-25 14:12:31
286
原创 nginx的相关命令
会将现在的所有master、worker及其之间的联系都复制一份,将新创建的master的id存放在nginx/logs/nginx.pid中,原来的master 的id存放在新创建的nginx/logs/nginx.pid.oldbin文件中,确认更新完毕后,会通过QUIT命令(需要程序员手动去执行)关闭原来的master相关进程。将nginx-new新版本安装目录编译后的objs目录下的nginx文件,拷贝到/usr/local/nginx/sbin目录下。2、nginx的命令行控制。
2024-11-10 23:47:29
557
原创 Nginx简单安装
因为nginx的默认的安装目录为/usr/local/nginx 所以nginx的配置文件中写的也是这个目录,为了不必要的麻烦,就也保持这个安装目录。把先前在桌面安装的nginx文件拖到这个local目录中,然后需要权限,需入一遍解锁密码就行了。反向代理:代理的是服务端,把服务端隐藏起来,安全,客户端只知道代理对象,不知道目标服务端。右键 你要下载的nginx的版本,复制链接地址,我下的1.26.2的Linux系统的。正向代理:代理的是客户端,把客户端隐藏起来,让服务端以外客户端是正确的,比如:翻墙。
2024-11-02 12:01:09
864
原创 mysql锁
锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源,,需要保证数据并发访问的一致性、有效性,锁冲突也是影响数据库访问并发访问性能的重要因素。2、InnoDB的行锁是针对索引加的锁,不通过索引条件检索数据(where后面的条件不是根据主键id),那么InnoDB将对表中所有记录加锁,此时会升级为表锁。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项来实现的,而不是对记录加的锁。
2024-11-02 11:05:54
831
原创 解析NIO
selector作用就是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非堵塞模式下,不会让线程吊死在一个channel上,适合连接数特别多,但流量低的场景。NIO 是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。分散读写:将一个channel中的内容分散读取到多个ByteBuffer中,这多个buffer存的内容共同组成一个channel的内容。
2024-10-20 12:44:27
475
原创 LUA脚本改造redis分布式锁
因为存在这样情况:线程一获取锁,去执行逻辑,过程中遇到网络动荡,线程一卡住了,然后一段时间后,线程一获取的锁的过期时间到了,线程一的锁自动释放。然后线程二来获取锁,线程二获取成功,去执行逻辑,而在这个过程中线程一的网络动荡恢复了,线程一继续执行,线程一先于线程二执行完,线程一去释放锁,但此时线程一创建的锁已经因超时而自动释放了,所以此时线程一会去错误的释放线程二的锁,所以我们要把线程id存入加以判断,防止误删其他线程的id。并不是一步一步的执行,所以只能用乐观锁但不建议用乐观锁,推荐用lua脚本。
2024-07-29 13:42:38
1125
原创 Seata解决分布式事务
我们曾经说的事务是只能在本微服务完成回滚,意思就是如果过程中出现问题需要回滚,只有更新订单状态 这一操作会回滚,而清空购物车和商品库存减一 这俩操作是远程调用其他微服务的操作,是不能回滚的,所以我们就需要分布式事务来解决这种问题。缺点:在若干个RM执行sql时,需要锁定数据库资源,不同的RM用的时间也不同,若有一个还没执行完,其余的执行完的RM就只能干等着,性能很差;我举的例子是:在网上购物时,我们支付后,订单微服务会更新订单状态,同时会远程调用购物车微服务清空购物车,和调用商品微服务完成商品库存减一。
2024-07-09 16:14:16
920
原创 Java代码实现elasticSearch的DSL复合查询
然后就是解析数据:这个要根据我们在es中做查询时返回的数据格式:我们要的是内层的那个hits中的source中的数据。单字段就是只对一个字段做查询,比如查询name字段中有 脱脂牛奶 的 ,格式是matchQuery("name", "脱脂牛奶")先写字段名,在写查询内容。多字段就是对多个字段进行查询,格式是 multiMatchQuery("脱脂牛奶", "name", "category") 先写查询内容,在写n个字段名,就是查询name中有"脱脂牛奶"的或者category中有"脱脂牛奶"的。
2024-07-09 15:22:32
1000
原创 elasticSearch的索引库文档的增删改查
type: 字段数据类型,常见类型有:1、字符串:text(可分词)、keyword(精确值,不可分词,比如品牌名);索引:相同类型的文档的集合(即同一类型数据的集合)叫索引(这个不是MySQL中的那个索引),为了区分开,我们通常把这的索引叫索引库(对应的mysql数据库中的table表)。我们都知道,elasticsearch在进行搜索引擎的工作时,是会先把数据库中的信息存储一份到elasticsearch中,再去分词查询等之后的工作的。映射:索引中文档的字段约束信息,类似表的结构约束。
2024-07-08 10:47:36
438
原创 elasticSearch快速了解
我是用的docker部署的,elasticsearch 8x以后的版本的api接口变化很大,目前还是用7x版本的多,所以我部署的7.12.1版本的。elasticSearch:经常用于搜索引擎,我们用的百度搜索和github上的搜索都是用的搜索引擎,它是对输入内容进行分析,然后查询,不像数据库模糊搜索的like一样必须含用你输入的全部内容。文档:对应的mysql表中的每一行的数据。比如“啊,呀,哦,喔等等”。随着社会网络的发展,网络上经常新出现很大新的网络用词,这些新的网络用词ik分词器就不能识别的。
2024-07-08 10:08:59
1133
原创 Sentinel解决雪崩问题
我们或多或少都对雪崩问题有点了解,在微服务系统中,各个微服务互相调用,关系错综复杂,如果其中一个微服务挂了或者处理消息的速度大幅下降,需要被处理的消息越积越多,那么影响的不仅仅是本微服务的功能,还会牵扯到调用该微服务的其他微服务出现问题,问题逐次传递,问题可就大了。熔断流程:当服务的异常比例、慢请求比例达到阀值后,就会被熔断一定时间,等时间过了,熔断器就会尝试着放行一次本服务,如果请求正常则放行,如果依然异常或者慢请求就会被继续熔断一定时间,不断循环。且Sentinel带有控制台,可以帮我们更方便的操作。
2024-06-29 21:24:48
951
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人