- 博客(115)
- 收藏
- 关注
原创 leetcode 递增子序列
题目给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]提示:1 <= nums
2022-05-23 17:32:48 174
原创 欧拉回路 Hierholzer算法
导读今天在刷leetcode时,遇到了欧拉回路的问题,之前没遇到过,这里做个笔记。欧拉回路与欧拉通路欧拉回路: 遍历所有边一次且行遍所有顶点的回路欧拉通路: 遍历所有边一次且行遍所有顶点的通路欧拉图: 具有欧拉回路的图半欧拉图: 具有欧拉通路的图判定条件欧拉图: 每个点度数都为偶数,相当于很多个环交叉起来。半欧拉图: 仅有两个点度数为偶数,相当于一条边连着两个欧拉图。Hierholzer算法Hierholzer 算法用于在连通图中寻找欧拉路径,其流程如下:从起点出发,进行深度优先
2022-05-23 16:04:56 355
原创 Synchronized锁升级、降级
多线程中锁的升级synchronized锁升级原理:在锁对象的对象头里面有一个threadid字段,在第一次访问的时候threadid为空,jvm 让其持有偏向锁,并将threadid 设置为其线程id,再次进入的时候会先判断threadid是否与其线程id一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了synchronized 锁的升级。锁的升级的
2022-05-20 22:49:01 2277
原创 布隆过滤器的原理和实现
导读想象一下遇到下面的场景你会如何处理:手机号是否重复注册用户是否参与过某秒杀活动伪造请求大量 id 查询不存在的记录,此时缓存未命中,如何避免缓存穿透针对以上问题常规做法是:查询数据库,数据库硬扛,如果压力并不大可以使用此方法,保持简单即可。改进做法:用 list/set/tree 维护一个元素集合,判断元素是否在集合内,时间复杂度或空间复杂度会比较高。如果是微服务的话可以用 redis 中的 list/set 数据结构, 数据规模非常大此方案的内存容量要求可能会非常高。这些场景有个共同
2022-05-20 15:57:41 322
原创 Redis哨兵模式
哨兵的作用哨兵是redis集群架构中非常重要的一个组件,主要功能如下:集群监控:负责监控redis master和slave进程是否正常工作消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员故障转移:如果master node挂掉了,会自动转移到slave node上配置中心:如果故障转移发生了,通知client客户端新的master地址哨兵的核心知识故障转移时,判断一个master node是宕机了,需要大部分的哨兵都同意才行,涉及到了分布式
2022-05-20 14:21:02 288
原创 leetcode 存在重复元素 III
问题给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。示例 1:输入:nums = [1,2,3,1], k = 3, t = 0输出:true示例 2:输入:nums = [1,0,1,1], k = 1, t = 2输出:true示例 3:输入:nums = [1
2022-05-19 22:24:30 261
原创 Redis RDB 和 AOF
导读RDB 和 AOF 对比:持久化方式选择如果对数据安全性要求极高,应该同时使用两种持久化方式。如果可以承受若干时间内的数据丢失,可以只使用 RDB 持久化。不建议只使用 AOF 持久化,因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份,并且 RDB 恢复数据集的速度要比 AOF 恢复的速度要快。RDB 和 AOF 的恢复优先级如果 Redis 同时使用 RDB 和 AOF 持久化,Redis 会优先使用 AOF 进行恢复数据。在启动 Redis 时,如果已经存在了
2022-05-18 17:50:18 750
原创 RDB持久化触发机制
RDB持久化触发机制手动触发手动触发分别对应save和bgsave命令:save命令:同步,在主线程中保存快照;阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用;bgsave命令:异步,Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。堵塞只发生在fork阶段,一般时间很短;BGSAVE命令是针对SAVE堵塞问题做的优化。因此Redis内部所有的设计RDB的操作都采用BGSAVE的方式,而sav
2022-05-18 16:50:50 477
原创 mybatis如何防止SQL注入?
sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入一、采用jdbc操作数据时候String sql = "update ft_proposal set id = "+id;PreparedStatement prepareStatement = conn.prepareStatement(sql);prepareStatement.executeUpdate();preparedStatement 预编译对象会对传入sql进行预编译,那么当传入.
2022-05-17 22:59:56 8375
原创 Redis配置文件解析
导读最近在学习Redis,那么首先需要了解的就是Redis的配置文件,弄懂其配置也是接下来学习Redis的基础。配置文件解析################################## INCLUDES(导入) ################################### # 引入其他配置文件include /path/to/local.conf ################################## MODULES(模块) ###############
2022-05-17 21:53:27 252
原创 leetcode 单调栈
下一个更大元素 I题目nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的
2022-05-17 10:22:45 51
原创 split()方法,limit参数作用
String.split()方法是有参数的,limit参数的作用有如下几种情况。limit = 0对结尾处的字符不进行分割String.split(String regex)默认的limit参数为0 public String[] split(String regex) { return split(regex, 0); }String s= "12/13/14//15//";String[] arr = s.split("/",0);Syste
2022-05-13 14:25:49 1657
原创 NC 113 验证IP地址
题目编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个
2022-05-13 14:03:22 116
原创 5.11华为笔试复盘
导读昨天参加了华为的上机笔试,整体感觉有点难,第一题直接整道hard,着实遭不住,下面就我的笔试情况,和大家谈论一下第一题。题目第一题,送祝福,题目大体意思就是一排人,每个人都有一张带有数字的卡片,大小不重复,如果你的比后面的人大,就要给后面的人送去祝福,最后返回祝福的数组blessing。解题思路大家一看,可以很快想出暴力解法,直接两层for循环,每次判断后面比你小的人有多少,记录count即可。但是毫无意外必定超时(我试了),接下来,我想可不可以利用dp,从后往前遍历,记录每个位置后面比你小的
2022-05-12 11:13:10 885
原创 Redis 乐观锁(CAS)
导读乐观锁介绍:watch指令在redis事物中提供了CAS的行为。为了检测被watch的keys在是否有多个clients同时改变引起冲突,这些keys将会被监控。如果至少有一个被监控的key在执行exec命令前被修改,整个事物将会回滚,不执行任何动作,从而保证原子性操作,并且执行exec会得到null的回复。乐观锁工作机制:watch 命令会监视给定的每一个key,当exec时如果监视的任一个key自从调用watch后发生过变化,则整个事务会回滚,不执行任何动作。注意watch的key是对整个连
2022-05-12 10:31:32 1845
转载 线程池核心设计与实现
导读线程池是一种通过“池化”思想,帮助我们管理线程而获取并发性的工具,在Java中的体现是ThreadPoolExecutor类。那么它的的详细设计与实现是什么样的呢?总体设计Java中的线程池核心实现类是ThreadPoolExecutor,本章基于JDK 1.8的源码来分析Java线程池的核心设计与实现。我们首先来看一下ThreadPoolExecutor的UML类图,了解下ThreadPoolExecutor的继承关系。ThreadPoolExecutor实现的顶层接口是Executor,顶
2022-05-10 13:12:45 140
原创 线程池结合SpringBoot
导读什么是线程池线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。创建线程本身开销大,反复创建并销毁,过多的占用内存。所以有大量线程创建考虑使用线程池。线程池不用反复创建线程达到线程的复用,更具配置合理利用cpu和内存减少了开销,性能会得到提高,还能统一管理任务比如服务器收到大量请求,每个请求都分配线程去处理,对服务器性能考验就比较大,如果创建5个以上线程考虑使用线程池。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等
2022-05-09 16:59:13 1149 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人