自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 LeetCode第65题 有效数字 结合设计模式:状态模式

用设计模式则非常清楚。但是设计模式是为了给人理解的,对机器而言也可能稍微影响性能;注意:这样写出来的代码经测试用时2ms,不如直接面向过程的if-else大法。单纯用状态机会有大量的if-else,非常不好看,思路不清晰。思路:有限状态机,结合Java的设计模式:状态模式。

2024-08-27 23:32:59 372

转载 转载:分库分表流程及其常见问题,讲得真的非常好

转载自微信公众号:程序员囧辉。

2024-08-27 23:25:32 19

原创 数据库不停机迁移方案

介绍停机迁移和不停机迁移

2024-08-25 12:49:00 555

原创 力扣LeetCode第29题:两数相除,beat100%解法

时间复杂度: O(logN),其中N为被除数和除数倍数差,也即商。logN即为被除数和除数二进制的位数差,比如1011111/11,那么logN为7−2=5。空间复杂度: O(1)

2024-08-08 23:40:23 602 2

原创 leetcode力扣第29题:两数相除

(2)对于每一个可能得商,跟除数相乘,然后跟被除数比大小,根据大小关系来决定商应该去左边区间还是右边区间。这里不能直接用乘法,所以得用类似于二进制竖式的方式,快速通过加法结合位移运算实现“快速乘法”如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。这题看似简单,实则一点也不难(不是),实则还是比较困难。还有一些细节上的难点,代码注释中写得很清楚。(1)通过二分法查找可能的商。

2024-08-05 23:07:11 492

原创 Integer比较大小的奇怪问题

从下面的源码可知,Integer对象的value一旦赋值是不可变的,因此要换value只能是换个Integer对象,然后把引用指向新的对象。这是因为java内部使用了享元模式,对-128到127之间的对象进行了缓存复用,所以a1、a2同一个对象。首先,两个对象比较是比较内存地址。也就是说,两个Integer直接比较是不会触发自动拆箱的。显然不是这样的,这和String类似,实际上再赋值,a1的内存地址就变了。那么为啥a1 == a2是true,a3 == a4却是false呢。

2024-07-24 12:33:53 524

原创 k个有序序列的合并,用小根堆解决

LeetCode第23题,这里如果会了,堆排序包括常见的对链表的处理肯定没问题了。

2024-07-23 00:54:14 624

原创 复习:归并排序

最好时间复杂度、最坏时间复杂度、平均时间复杂度都是o(nlog2n)* 和堆排序、快速排序的时间复杂度一样。* 空间复杂度:o(n)

2024-07-22 23:31:55 215

原创 堆排序:最复杂的排序算法之一,但也没那么难

个人认为主要的麻烦在于一些临界条件的判断,比如是i还是i-1,是size还是size-1?快排的话数据集中在一起,更满足缓存的局部性原理?时间复杂度和快速排序一样也是o(nlog2n)据说是因为有很多不必要的交换。其实跑一下调式一下也就好了。但实际表现往往不如快排。最复杂的排序算法之一。

2024-07-21 17:07:08 121

原创 简单选择排序

注意此算法不稳定;即不能保证两个相同大小的元素在排序前后的顺序一致。* 时间复杂度,无论初始序列为顺序、逆序、乱序,都是o(n^2)

2024-07-21 12:28:14 88

原创 动态规划2:计算最大连续子序列和

【代码】动态规划2:计算最大连续子序列和。

2024-07-21 11:39:50 280

原创 动态规划-1:穷举遍历->map缓存->取消递归

【代码】动态规划-1:穷举遍历->map缓存->取消递归。

2024-07-21 10:15:38 220

原创 复习:快速排序

【代码】复习:快速排序。

2024-07-20 22:54:23 403

原创 复习:冒泡排序

【代码】复习:冒泡排序。

2024-07-20 21:39:14 79

原创 复习插入排序

【代码】复习插入排序。

2024-07-20 20:46:41 128

原创 二分查找复习

【代码】二分查找复习。

2024-07-20 18:27:28 125

原创 KMP算法完整版 包括求next数组的算法及其优化

【代码】KMP算法完整版 包括求next数组的算法及其优化。

2024-07-20 17:29:57 415

原创 字符串算法之一:朴素算法找子串

【代码】字符串算法之一:朴素算法找子串。

2024-07-20 12:32:31 185

原创 分布式缓存复习

这里存在一个问题,就是比如A机器修改数据库数据为1,他刚要改缓存,可能因为机器卡顿、网络卡顿等各种原因,改的比较慢,他还没改,B机器把数据库数据改为2,并且把缓存改为2了,这时候A机器又把缓存改为1了。首先,显然这也数据不一致的问题,其次,先写数据库,后写缓存,缓存跟着数据库走,稍微有点延迟,这叫最终一致。更严重的情况是,一般写操作在更新数据库之后都会更新缓存,或者先使缓存失效再更新数据库,无论怎么做,如果使用本地缓存,都只能保证当前机器的混存一致性,而其他机器则会继续缓存错误的数据。

2024-07-16 00:29:15 817

原创 RabbitMQ复习

路由键与队 列名完全匹配,如果一个队列绑定到交换 机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发 “dog.puppy”,也不会转发“dog.guard” 等等。它是完全匹配、单播的模式。为了保证可靠传输,除了上述的消息确认机制外,还需做好容错方法(try-catch),因为网络波动等原因直接在发送端就没能发送消息是常有的情况,这时候需要有重试机制。multiple为true表示批量确认,即确认此消息的tag号及其之前的所有消息,有的想TCP通信中的确认。

2024-07-15 20:48:00 738

原创 基础回顾:啥叫前后端分离

你可以把这种vue项目叫做前端项目,但是把浏览器当做前端的话,那他这个相对而言也是一个。你后端用java写,用python写,用C写等等,我不care,反正我就是请求某个。如果你把vue项目跑起来,他可以提供各种页面及其跳转逻辑,这个也是在服务器上跑的,比如vue的路由就可以实现。至于你前端拿到这个数据怎么展示那是你的事,你可以用特别炫酷好看的页面来展示,这个页面的跳转,显然还是要发请求,但是这个请求不是发给java等后端工程了,给你这个数据(注意,我只给你数据,不给你页面,不会给你返回html啥的),

2024-07-15 16:09:12 402

原创 学习笔记:java的23种设计模式总结

学习笔记

2024-07-10 21:43:12 1370

原创 Springboot引入依赖自动注入bean的实现

注意:通常来说一个第三方包都会注册很多的bean到容器中,因此spring.factories中可以写一个标注了@Configuration的类,引入了这个类,他下面所有的@Bean标注的方法注册的bean都会放到容器中了。2、使用者主动用@Import引入,这个也没能实现自动注册,可以直接引入(比如)User.class,也可引入@Configuration加@Bean的类。3、用自定义的@Enable封装一下第二步的@Import结果,好处是更好看点,缺点是还是需要使用者主动引入。

2024-07-09 18:41:17 302

原创 分布式系统的CAP定理

如果比如某个从节点和主节点之间的通信断掉了,系统出现了分区(partition),这个时候一致性C和可用性A就只能选一个了。比如更新主库x=1变为x=2,如果主库更新后不等从库更新(比如只是通过binlog异步更新从库的数据),立即返回成功,这样保证了可用性,但如果有人访问到还没更新的从库,就会得到旧数据,这就不满足一致性了。分区容错性是说,即使网络有故障,比如某个从节点和主节点之间的通信断掉了,系统出现了分区(partition),整个系统仍能正常运行(partition tolerance)。

2024-06-19 22:46:52 430

原创 utf8和utf8 bom的区别以及由此产生的对字符编码的思考

在UCS 编码中有一个叫做 "Zero Width No-Break Space" ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。感觉还是没太明白,先简单理解就是(本文后面会再来研究这个问题),BOM这个标记是用来表示文件编码信息的。查阅资料可知,BOM是Byte Order Mark的缩写,是用来标记文件编码的大小端的(这个后面讲),UTF8是不需要标记大小端的。utf8编码的只占0个字节,而utf8 bom编码的,虽然文本内容为空白,但已经占用了3个字节。用notepad看下,果然是你!

2024-05-25 10:21:12 1195

原创 安全研发总结(二):XSS攻击及其防御

攻击成功后,攻击者可能获取用户的敏感信息,如Cookie、会话信息等,甚至执行更高权限的操作,如劫持用户会话、插入恶意内容、重定向用户到恶意网站等。攻击者通过利用网页开发时留下的漏洞,注入恶意代码到网页中。仔细看看会发现,xss攻击其实和sql注入攻击很像,都是通过输入一些未预期的参数来扭曲原本的语义,只不过前者扭曲的sql语句,后者扭曲的是html便签。在过滤器中加上一个全局的输入转义或输入转义即可,由于post请求中可能带有 < > & 等符号,为了防止正常输入被转义后无法识别,建议只对输出转义即可。

2024-05-20 21:46:34 413

原创 安全研发总结(一):SQL注入漏洞及其防御

(1)使用预编译的sql,即PreparedStatement,这是最好的办法。的sql就已经被数据库编译、优化了,后续传入的参数不会被认为是sql指令,而只是当做一个值注入占位符,由于不存在sql的重新编译,因此也不可能改变其原有的语义,不存在sql注入的可能。这里注意,转义是对传入的参数转义,而非对整个sql语句转义。SQL注入是一种安全漏洞,攻击者通过影响Web应用程序的后端数据库执行未授权的SQL命令。这通常是通过将恶意SQL代码注入到应用程序的输入字段中实现的,例如通过在搜索框中输入。

2024-05-19 21:25:07 448 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除