- 博客(272)
- 收藏
- 关注
原创 (day 51 - 排序+夹牌 ) 剑指 Offer 61. 扑克牌中的顺子
题目题链:剑指 Offer 61. 扑克牌中的顺子题解解法一:遍历+排序+标记遍历一遍先把大小王求出来、然后再从除去大小王的索引处开始遍历。flage-nums[i+1] - nums[i]) + 1表示的是大小王的数量、假设相邻的数相差的数大于大小王的总数量那么一定无法构成顺子那么相减之后flag肯定是小于0,temp>flag是防止有重复元素出现。class Solution { public boolean isStraight(int[] nums) { A
2021-08-27 16:03:51
179
原创 (day 51 - 字符转化为数字 ) 剑指 Offer 67. 把字符串转换成整数
题目题链:剑指 Offer 67. 把字符串转换成整数题解K神大佬详细题解:面试题67. 把字符串转换成整数(数字越界处理,清晰图解)题目怎么说呢、难度在于很麻烦,要仔细。大概步骤:先去除两边空格、转化为字符数组再判断字符数组是否为0、为0直接返回0再设置一个变量sign表示正负判断第一是否为正负字符、为﹣就将sign改为-1、且将开始遍历的索引改为1然后开始遍历、先判断是否为数字、不是直接返回0再判读是否超过最大值、超过根据符号±直接返回都不满足5、6条件就是进行拼接了最后遍
2021-08-27 14:34:16
129
原创 (day 50 - 动态规划+概率论 ) 剑指 Offer 60. n个骰子的点数
题目题链:剑指 Offer 60. n个骰子的点数题解自己很菜、看到这道题是一脸懵的、看了题解才知道怎么去做。K神详细题解:剑指 Offer 60. n 个骰子的点数(动态规划,清晰图解)class Solution { public double[] dicesProbability(int n) { double[] res = new double[6]; Arrays.fill(res,1.0/6.0); for (int i =
2021-08-26 14:29:02
145
原创 秒杀项目汇总
秒杀项目笔记汇总耗时半个多月终于学完了、笔记也做完了、接下来就是秋招了。冲冲冲(秒杀项目) 4.2 用户登录和注册(秒杀项目) 4.3 商品列表与详情(秒杀项目) 4.4 用户下单与秒杀(秒杀项目) 4.5 项目部署与压测(秒杀项目) 4.6 分布式状态管理(秒杀项目) 4.7 缓存商品与用户(秒杀项目) 4.8 异步化扣减库存(核心)(秒杀项目) 4.9 削峰限流与防刷(核心)(秒杀项目) 4.10 项目面试项目常见问题...
2021-08-25 23:54:57
1294
2
原创 (秒杀项目) 4.10 项目面试项目常见问题
1. 你的项目是自己做的还是找来的这个项目是我在学校里的大学生创新创业大赛、别的院的学生要做一个电商平台。然后到我们大数据学院找人做,最终在我们院找了几个人做的这个项目。我负责了秒杀这个模块。2. 你在项目中遇到的最大的问题是什么问题一在做异步化扣减库存模块的时候、因为要使用到rocketmq所以我要在我的linux服务器上安装配置rocketmq、根据网上一些安装配置博客进行安装配置,后来按照他们的安装配置步骤一步步的走安装配置好之后,但我在启动的时候他一直启动不起来。开始我一直怀疑是不是我的步骤
2021-08-25 23:49:14
1261
原创 (day 49 - 另起数组牺牲空间换取时间 ) 剑指 Offer 66. 构建乘积数组
题目题链:剑指 Offer 66. 构建乘积数组题解题目规定了不能使用除法、这样的话i后面的数值的乘积可使用遍历了直接求出来解法一:三指针暴力解法这种解法是简单暴力、但时间负责度为O(n2),根据题目的数据规模10万果不其然会超时。class Solution { public int[] constructArr(int[] a) { int i = 0 , j = 0, k = 1 ; int[] res = new int[a.length];
2021-08-25 17:32:09
113
原创 (day 48 - 双端队列的使用 ) 剑指 Offer 59 - II. 队列的最大值
题目题链:剑指 Offer 59 - II. 队列的最大值题解K神详细题解:剑指 Offer 59 - II. 队列的最大值(单调双向队列,清晰图解)队列的push和pop实现O(1)复杂度使用普通的单向队列就行了、但这个max的求解需要使用到双端队列deque。我们可以使用双端队列实现max的维护、当有新的值进入时把小于新值的元素poll掉,然后再push进去。poll元素时当polld的元素等于当前deque的队首时要poll掉维护最大值的元素。deque的使用:java关于Deque的使用
2021-08-24 21:44:24
167
原创 (秒杀项目) 4.9 削峰限流与防刷(核心)
一、削峰限流1. 削峰限流的目的目的就是解决下单操作时流量过大的问题、假设有某个商品商品总数只有一个、而抢他的人有几百万个、那么在秒杀时假设没有限流一秒之内一个服务器突然就受到了百万几的压力、这样服务器很容易就会奔溃挂掉。而削峰限流的目的就是为了防止这种事情的发生保护服务器的安全。2.削峰限流的解决方案大题实现逻辑如上图验证码:它的目的是平滑流量、在进行秒杀的时候防止秒杀的流量过高。假设有几百万个用户秒杀一个商品如不做任何处理直接单击购买商品后就直接生成订单进行秒杀、这将会是秒级百万的流量这样会
2021-08-24 17:02:35
2109
原创 (day 47 - 位运算 ) 剑指 Offer 65. 不用加减乘除做加法
题目题链:剑指 Offer 65. 不用加减乘除做加法题解K神详细题解:面试题65. 不用加减乘除做加法(位运算,清晰图解)题目明显要求不能用算术运算符、那么只能通过位运算解了。无论什么加法运算都分为两种情况进位和不进位、10机制的加法中假设8+5这里加的时候个位会有3,进位是1但我们会向左移一位变成10然后再用10+3就等于13这次没有发生进位。二进制中的运算也是如此。在二进制中不进位时是用异或运算,进位使用且&运算。因为只有1+1才会进位其他1+0,0+1,0+0都是不会发生进位恰
2021-08-23 13:44:01
172
原创 (秒杀项目) 4.8 异步化扣减库存(核心)
一、安装RocketMQ官方下载地址:http://rocketmq.apache.org/dowloading/releases/打开下载地址找到要下载的版本、复制链接。然后再Linux中使用命令wget 链接进行下载,然后使用unzip命令解压缩。解压完之后给他最高的可执行权限执行 chmod -R 777 rocketmq-all-4.8.0-bin-release更改配置修改相应的配置、应为默认的内存大小是4个G、我们要根据需求改成我们合适的大小。修改runserver.sh
2021-08-23 02:25:25
3944
4
原创 (day 46 - 小根堆 || 动态规划 ) 剑指 Offer 49. 丑数
题目题链:剑指 Offer 49. 丑数题解官方题解:丑数解法一:小根堆第一个数是1、后面就是每次使用2、3、5乘以当前最小的数即可。比如先是1,使用2,3,5乘后小根堆里就有1、2、3、5,然后再用2乘以2、3、5就是有1、2、3、5、4、6、10因为是使用小根堆存的所以会自动排好序,但有可能出现重复的数、所以我们可以使用hash去重、每次添加的时候判断这个元素有没有重复。class Solution { public int nthUglyNumber(int n) {
2021-08-22 21:42:36
126
原创 (day 45 - 中序遍历 ) 剑指 Offer 54. 二叉搜索树的第k大节点
题目题链:剑指 Offer 54. 二叉搜索树的第k大节点题解很明显这题一看就会想到中序遍历、但这个是从大到小的遍历,所以遍历顺序是右 -> 中 -> 左。解法一:中序遍历+列表自己先是使用了一个额外列表直接将遍历完的数字添加到列表中然后直接根据索引得出结果。这种时间负责度和空间复杂均为O(n)。class Solution { private ArrayList<Integer> res = new ArrayList<>(); publ
2021-08-21 21:29:27
153
原创 (day 44 - 滑动窗口 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目题链:剑指 Offer 53 - II. 0~n-1中缺失的数字题解K神大佬详细题解:面试题48. 最长不含重复字符的子字符串(动态规划 / 双指针 + 哈希表,清晰图解)public int lengthOfLongestSubstring02(String s) { int i = -1,res = 0; HashMap<Character,Integer> map = new HashMap<>(); for (int j = 0; j &
2021-08-20 22:52:44
88
原创 (day 43 - 二分查找 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目题链:剑指 Offer 53 - II. 0~n-1中缺失的数字题解解法一:暴力遍历public int missingNumber(int[] nums) { int n = nums.length; for (int i=0;i<n;i++){ if (i != nums[i]){ return i; } } return n;}解法二:二分查找看见有序数组的首先应该想到的是二分查找pu
2021-08-19 22:13:43
89
原创 (day 42 - 字符翻转 ) 剑指 Offer 58 - II. 左旋转字符串
题目题链: 剑指 Offer 58 - II. 左旋转字符串题解这题解法很多种、切片、遍历都可以。其中有一种比较有意思的是翻转三次解法一:遍历拼接这种方法时间和空间负责度均为O(n)class Solution { public String reverseLeftWords(String s, int n) { StringBuilder sb = new StringBuilder(); for (int i = n; i < s.length
2021-08-18 15:53:56
301
原创 (day 41 - 二分查找) 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目题链:剑指 Offer 53 - I. 在排序数组中查找数字 I题解两种解法第一种最最显而易见的就是直接遍历计数暴力解决、第二种就是二分法降低时间复杂度。解法一:暴力遍历遍历完整个数组即可、时间复杂度为O(n),空间复杂度为O(1)class Solution { public int search(int[] nums, int target) { int res = 0; for(int i = 0;i < nums.length ; i+
2021-08-17 11:43:06
134
原创 (day 40 - 双指针+库函数) 剑指 Offer 58 - I. 翻转单词顺序
题目题链:剑指 Offer 58 - I. 翻转单词顺序题解解法一:纯库函数使用split("[ ]+")切割分成字符串数组、然后再遍历拼接、最后使用trim()去掉两边的空格即可。public static String reverseWords(String s) { String[] cs = s.split("[ ]+"); StringBuilder sb = new StringBuilder(); for (int i = cs.length-1; i &g
2021-08-16 14:36:52
87
原创 (day 39 - 动态规划) 剑指 Offer 47. 礼物的最大价值
题目题链:剑指 Offer 47. 礼物的最大价值题解看到题呢题目说要用动态规划、我用了dfs去解果不其然超时了。class Solution { private int maxValue = 0; public int maxValue(int[][] grid) { dfs(grid,0,0,0); return maxValue; } void dfs(int[][] grid,int r,int l,int cur){
2021-08-15 16:31:20
107
原创 (秒杀项目) 4.7 缓存商品与用户
一、缓存商品本项目中在商品缓存用到了二级缓存、本地缓存使用guava、服务器缓存用redis缓存。使用guava缓存要先导入guava的依赖。<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0.1-jre</version></dependency>
2021-08-15 00:08:04
524
原创 (day 38 - 双指针) 剑指 Offer 52. 两个链表的第一个公共节点
题目题链:剑指 Offer 52. 两个链表的第一个公共节点题解本题使用双指针、A = headA,B = headB,假设C为相交的公共节点长度为c。A,B长度分别为a,b,很容易发现a+(b-c) = b+(a-c)。a+(b-c)为A节点走完了A节点后再去走B节点直到走到第一个公共节点。b+(a-c)为B节点走完了B节点后再去走A节点直到走到第一个公共节点。有一个浪漫的说法就是“我变成你,走你走过的路。你变成我,走我走过的路。然后我们相遇了”可以完美的映射本题的解题思路。所以有代码
2021-08-14 19:58:05
121
原创 (day 37 - 动态规划)剑指 Offer 46. 把数字翻译成字符串
题目题链:剑指 Offer 46. 把数字翻译成字符串题解看到这个题知道是用动态规划、但就是不知道怎么找递推式和状态、动态规划还是得多刷。K神大佬题解:面试题46. 把数字翻译成字符串(动态规划,清晰图解)class Solution { public int translateNum(int num) { String str = String.valueOf(num); int a=1,b=1,c=1; for (int
2021-08-13 22:13:19
120
原创 (秒杀项目) 4.6 分布式状态管理
一、安装整合redis安装使用redis对项目加缓存优化商品列表、商品详情的访问性能。安装教程参考:阿里云 centos 7.6 安装和启动redis 6整合首先引入redis的依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></d
2021-08-13 21:18:59
570
原创 算法-滑动窗口
1. 什么是滑动窗口是一种基于数组的数据结构的算法、本质上是双指针。滑动窗口可以看成数组中框起来的一个部分。在一些数组类题目中,我们可以用滑动窗口来观察可能的候选结果。当滑动窗口从数组的左边滑到了右边,我们就可以从所有的候选结果中找到最优的结果。滑动窗口的左右边界只能向右移动。2. 滑动窗口模板理解并记下来对刷题很有帮助。public int[][] findContinuousSequence(int target) { int i = 1; // 滑动窗口的左边界 int j
2021-08-12 21:52:50
209
原创 (day 36 - 滑动窗口)剑指 Offer 57 - II. 和为s的连续正数序列
题目题链:剑指 Offer 57 - II. 和为s的连续正数序列题解大佬视频讲解:Java 滑动窗口 典型框架 视频讲解滑动窗口文字详细讲解:什么是滑动窗口,以及如何用滑动窗口解这道题(C++/Java/Python)之前没了解过什么是滑动窗口、看了题解才知道本质上就是双指针。class Solution { public int[][] findContinuousSequence(int target) { int l=1,r=2,sum=3; List<
2021-08-12 21:43:43
125
原创 (秒杀项目) 4.5 项目部署与压测
一、项目部署1. 部署逻辑因为是前后端分离开发、所以部署到服务器上前后端要分别部署。nginx:使用web服务做前端页面浏览的服务器。反向代理用来做发送后端数据接口请求的地址转发。tomcat:用来做后端服务器。大致逻辑: 浏览器端输入url地址 —> 请求web服务器前端页面 —> 发送ajax请求 —> 访问反向代理 —> 请求后端接口 —> 返回数据给反向代理 —> 返回给浏览器。这里使用80端口表示请求的是前端页面、90端口请求的是后端接
2021-08-12 02:13:03
1169
原创 (day 35 - 自定义排序规则 )剑指 Offer 45. 把数组排成最小的数
题目题链:剑指 Offer 45. 把数组排成最小的数题解k神详细题解:剑指 Offer 45. 把数组排成最小的数(自定义排序,清晰图解)本题其实就是排序、没有使用过自定义的排序函数和字符串专属的比较函数compareTo是很难解出来的。Java compareTo() 方法(菜鸟教程)方法一:自己写排序算法、快速排序快排模板class Solution { // 自定义快排 public String minNumber(int[] nums) {
2021-08-11 15:03:40
139
原创 (day 34 - 哈希表 or 双指针 )剑指 Offer 57. 和为s的两个数字
题目题链:剑指 Offer 57. 和为s的两个数字题解大佬详细题解:面试题57. 和为 s 的两个数字(双指针 + 证明,清晰图解)最简单的就是暴力解法、直接双重循环、显然时间复杂度是O(n^2)是不可取的。使用哈希表稍微好点,由于数组是有序序列、所以我们可以使用双指针一个在前一个在后。解法一:使用哈希表public int[] twoSum02(int[] nums, int target) { HashMap<Integer,Integer> map = new H
2021-08-10 15:13:37
115
原创 (day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
题目题链:剑指 Offer 56 - II. 数组中数字出现的次数 II题解参考的K大佬题解:面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解)题目给的条件是一个数组中只有一个单个数、其它都是3个数。和I不同的是这里是三个数一起、使用异或明显行不通了。如下图所示,考虑数字的二进制形式,对于出现三次的数字,各二进制位出现的次数都是3的倍数。因此,统计所有数字的各二进制位中1的出现次数,并对3求余,结果则为只出现一次的数字。所以我们可以用一个长度为32的
2021-08-09 18:07:11
152
原创 MVCC常问面试题(面试重点)
如果你是路人建议先看一遍参考:MVCC多版本并发控制看完再看我这个、我提炼是一些面试中用来回答的参考。知道什么是当前读和快照读吗?答:简单来说在高并发情况下当前读是获取最新的记录并且其他事务不能修改这个记录、快照读获取的有可能是老的数据。当前读是加了锁的、加的是一种悲观锁。而快照读是没加锁的。请你讲下MVCC是什么?答:全称Multi-Version Concurrency Control、就是一种多并发版本控制器、通俗点就是一种并发控制的方法,一般用于数据库中对数据库的并发访问。Mysql中的
2021-08-09 01:40:22
5502
原创 (day 32 - 位运算 )剑指 Offer 56 - I. 数组中数字出现的次数
题目题链:剑指 Offer 56 - I. 数组中数字出现的次数题解
2021-08-08 22:23:43
135
原创 (秒杀项目) 4.4 用户下单与秒杀
一、慢查询分析慢查询分析是通过开启慢查询日志开关、然后执行某个sql超过了配置的查询最大时间会将这条sql记录到慢查询日志中,以便我们开发人员进行分析检查查询慢的原因,方便进行sql优化。(面试时我们可以编一个故事、我们在做项目中是如何进行sql优化的、比如我们可以假设在商品展示中发现商品列表加载太慢、然后通过使用慢查询分析发现是查询商品活动信息sql语句超时、经过分析是查询没有使用索引、优化后使用索引提高了页面的加载速度。)打开慢查询日志开关有两种方式一种是设置参数、一种是修改配置文件。这里使用设置
2021-08-08 20:58:53
840
原创 (day 30 - 二叉树的先序遍历 )剑指 Offer 55 - I. 二叉树的深度
题目题链:剑指 Offer 55 - I. 二叉树的深度题解看到题我想到的是使用递归、每遍历一个节点就用一个变量计数加一、等到了最后叶子节点表示已经遍历到最底部、然后用一个外部记录每个根节点深度的变量来找出最大深度的叶子节点。使用的是先序遍历的思想。题解有后序遍历、和层遍历的题解。大佬详细题解:面试题55 - I. 二叉树的深度(后序遍历、层序遍历,清晰图解)class Solution { private int max = 0; public int maxDepth(T
2021-08-07 14:05:21
169
原创 (秒杀项目) 4.3 商品列表与详情
一、登录状态的维护登录状态的维护是通过session来维护、上节说到登录成功后会存一个loginUser对象到session中。当对象没有登录时自然就不会有这个对象、所以在购买商品时没有登录是无法进行购买的,而实现这个功能用到的是springmvc的拦截器功能。登录拦截器的实现想要使用拦截器首先要自定义一个拦截器、然后注册到ioc容器中。自定义拦截器自定义拦截器就是写一个类实现HandlerInterceptor接口、实现这个接口可以重写三个方法、如下图分别是:preHandle:控制器执行
2021-08-07 01:06:55
829
1
原创 (day 29 - 二叉树的先序遍历 )剑指 Offer 34. 二叉树中和为某一值的路径
题目题链:剑指 Offer 34. 二叉树中和为某一值的路径题解先序遍历+回溯、找到满足条件的路径,注意的是添加结果结合的时候要新建一个集合。大佬详细题解:面试题34. 二叉树中和为某一值的路径(回溯法,清晰图解)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNo
2021-08-06 14:16:20
147
原创 (day 28 - 哈希表 )剑指 Offer 50. 第一个只出现一次的字符
题目题链:剑指 Offer 50. 第一个只出现一次的字符题解哈希表、字符做键、boolea类型做值。class Solution { public char firstUniqChar(String s) { char[] chars = s.toCharArray(); Map<Character,Boolean> map = new HashMap<>(); for (char c : chars) {
2021-08-05 20:46:20
110
原创 面试题-为什么索引使用B+树、而不是B树?或者其他红黑树,二叉树
介绍下B树和B+树B树b树是一种平衡多路查找树、相比平衡二叉树它一个节点可以存多个元素、一棵m(m是指一个节点最多有几个子节点)阶的B 树有以下特性:树中根节点若不是子树、必须至少有两个子节点。除根节点和叶子结点其他结点至少有[ceil(m/2)](向上取整、比如m=5,就至少有3个子节点)个节点。节点存储的元素的个数范围是 [ceil(m / 2)-1]<= n <= m-1个B树叶子结点不包含任何元素、也就是null(为空的目的是查到叶子结点表示没有找到返回null)B+
2021-08-05 00:32:21
424
原创 (秒杀项目) 4.2 用户登录和注册
一、注册模块实现前端页面通过页面可知、注册需要先通过发送验证码给手机号码然后输入正确的验证码后才能进行注册。后端实现验证码模块点击发送验证码会请求后端接口/otp/{phone}、找到对应的controller实现。由代码可知分成三步、生成验证码->绑定验证码–>发送验证码生成验证码的函数可知是随机生成4位数。将验证码绑定到session中、然后再发送。注册模块单击注册之后会请求后端的/register接口、找到对应的处理器由代码可知、会先验证验证码是否正确、
2021-08-04 21:02:00
1126
原创 (day 27 - 递归分治 )剑指 Offer 33. 二叉搜索树的后序遍历序列
题目题链:剑指 Offer 33. 二叉搜索树的后序遍历序列题解本题的关键是要知道后序遍历的特点是根节点是在最后一个输出的、假设序列长度为n,也就是说根节点的下标就是n-1,在后续遍历的序列中从第一个元素开始直到找到的第一个比最后一个元素根节点大的元素是左右子树的分界点、设这个节点的索引为m,则0到m-1都是属于根节点的左子树、m到n-1-1都是右子树。明白了后续遍历的特点之后、使用递归来处理相同的子问题。大佬详细题解:面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解)c
2021-08-04 16:02:04
180
原创 B树和B+树
结合这几篇文章可以对B树B+树有一定的了解。简书:数据结构之B树与B+树b树和b+树区别_一点微小的改动,让你从B树理解到B+树从B树、B+树、B*树谈到R 树
2021-08-04 01:23:27
76
原创 (day 26 - 广度优先搜索 )剑指 Offer 32 - III. 从上到下打印二叉树 III
题目题链:剑指 Offer 32 - III. 从上到下打印二叉树 III题解和前面的1,2一样都要用到bfs、然后按层遍历、不同的是这个加了左右方向。加个双端队列也就是使用Linkedlist就能解决。大佬详细题解:面试题32 - III. 从上到下打印二叉树 III(层序遍历 BFS / 双端队列,清晰图解)/** * Definition for a binary tree node. * public class TreeNode { * int val; * T
2021-08-03 23:06:45
139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅