自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 黑马点评----> 缓存穿透与击穿

首先这个接口是通过店铺id查询店铺信息的,但是redis中的key一般是有前缀的,这个前缀人为定义,并且不同缓存的前缀不一样,因为实现的是通用的缓存穿透问题,所以需要将前缀作为参数。redis中有一个就是很明显的互斥锁,即setnx方法,只有redis中不存在对应key的时候才能成功存储也就是返回1,如果redis中存在对应key,返回的就是0。所以解决方法就是:即便数据库中没有这个data,也要往redis中对应的key存储一个设置了TTL的空值,这样每次请求打过来就不会一直打到数据库上了。

2026-01-19 10:16:21 342

原创 Day10 用户端订单模块

service层的逻辑如何走呢,首先先看下有无异常条件需要判断,比如用户提交的时候没有地址,黑马还让校验购物车是否为空,其实我觉得这里应该是前端该做的事?插入订单之后,该订单还有一个order_detail表里面contain了具体点了什么菜品所以也需要插入这个表,由于要保持二者的事务一致性,所以别忘了加transactional。再来一单的逻辑就是,我们对着一个订单点击再来一单,根据这个订单的下单内容重新填充我们的购物车。跳过了,和第三条历史查询高度重合,简单的查出指定的订单以及detail返回就好了。

2026-01-14 10:16:26 427

原创 苍穹外卖Day09 地址簿模块

所以其实本质就是,最初我们有一个list接口帮助查出所有地址,这个时候前端就拿到了所有地址的id,之后再去点击修改,它会把这个id重新发回后端,我们就能准确到底需要修改的地址并且展示出来以及修改。其实本质是一个update功能,但是由于默认地址只能有一个,当我们设置一个新地址为默认地址之后就需要将其他地址设置为非默认地址。这一块比较简单就是一个表的增删改查,也不涉及别的知识,所以黑马就是带着我们导入了一下代码,所以这里做点简单的解释就过去了。当前我们可能是没有默认地址的,所以需要判别一下。

2026-01-08 14:50:47 388

原创 苍穹外卖Day08 购物车功能

本身就是一个查询操作,这里有一个问题,就是其实系统的用户是有很多的,但是本项目做的是单微信用户,所以其实我们购物车里面有一个usrId,每次查询购物车内容的时候需要通过ThreadLocal得到用户id再送入SQL查询。就只需要给它的number++即可,提一下这里的查询为什么是List<ShoppingCart> 其实根据id和userId找到的肯定只有一个ShoppingCart 其实没多大意义?分情况讨论,如果商品的number是>1的我们只需要修改number即可,反之我们直接删除这条购物车数据。

2026-01-07 10:46:34 271

原创 苍穹外卖Day06 微信小程序模块

没必要看接口了,前端点击了一个category的bottom这个bottom是由前面的分类查询查找出来的,所以会有一个categoryId点了bottom就会将该分类的categoryId传给后端,后端根据分类Id查询菜品,菜品返回给前端的是一个VO对象,这个对象不仅仅包括了菜品的信息,也包括了该菜品的Flavor所以要操作两个表。最后套餐查询有一个特殊的点,就是查询套餐的具体内容,因为一个套餐可以包括多个菜品所以它具备具体的内容,多一个接口。返回的是套餐的list对象,下面是service层的代码。

2026-01-06 21:04:46 379

原创 苍穹外卖Day05 店铺状态设置

配置redis的方式就不说了,在yml文件中配置上host port password即可,这里我用的是docker中的redis注意端口映射!注意的点就是用户端和管理端的RestController记得取别名,不然会重名,spring找不到。请求参数这里仅仅是一个jwt令牌用于确定登录状态~本质上就是查询redis中KEY的value值。这里的KEY统一设置为"SHOP_STATUS"作为redis中的key存入redis。2.用户端仅有一个查询状态,同管理层一样。首先我们需要注入操作redis的对象。

2026-01-05 11:13:37 128

原创 苍穹外卖Day04 套餐管理

所以我们实现的逻辑就是拿到套餐id去查询套餐表,将数据填充至VO中,此时还有setmealdish这个表没有查询,根据前面查询到的setmeal_id去查询得到的是一个List<setmealdish>,同样存入VO中返回给前端!(3) 在2删除完之后我们需要重新插入关联的菜品,这里需要注意的是可能前端没给我们它具体关联的套餐id,所以需要手动赋值,最后调用前面新增套餐时候封装好的insertBatch接口插入表就好了。要把套餐起售首先需要判断套餐里面的菜品是否是起售状态,如果不是则不可以起售套餐。

2026-01-03 12:35:59 894

原创 苍穹外卖Day03 公共字段填充与菜品管理

这里是insert操作,所以可以用上我们在前面做的AOP自动填充字段!这里的SQL比较特殊由于Flavor表需要记录dish_id但是这里我们的dish还未存进表里,自己也不清楚id是多少,所以利用动态SQL的操作且SQL中id(auto_increment)功能在插入之后自动将id写入entity中!上述两图表示AOP的自动填充字段,即在执行下方的SQL之前会自动把四个字段填充到dish中...随后执行下方的SQL,执行完后会把自动生成的id也赋给dish..

2025-12-31 14:17:47 499

原创 苍穹外卖Day07 缓存菜品与缓存套餐功能

来到下面<collection 这里的property表示的是DishVO的属性名,但是在DishVO中是List<DishFlavor>也就是这个字段是一对多的,后面的ofType表示就是List存储的对象。(1)新增菜品的时候我们会选择一个category,如果没有即使更新缓存,客户访问的时候由于不走数据库所以会无法查询到新增加的菜品,所以在新增菜品这个操作后我们需要清楚对应category的缓存。首先定义一个 id 后续select中要用到,表明它查出来的需要找到这个Map对应封装。

2025-12-30 20:21:51 668

原创 苍穹外卖Day2 分类管理功能

返回的就是entity数组,所以这里controller的Result中的泛型应该是List<category>,至于为什么是这样就像上面说的前端会根据返回值将id隐藏到选项中,一旦选择了某个菜品分类,就会自动赋值categoryid,像新增菜品中是如何得到categoryid就是这样得到的。从上述图中可以得到,用的PUT方法,并且是用过json传递参数,包括id,name,sort,type四个参数,通常从前端接收用的是DTO,别忘记了@RequestBody。前端传过来的是分类的ID即主键!

2025-12-30 10:53:48 792

原创 苍穹外卖day1 员工管理总结

这里需要了解set的作用以及各个属性分别代表什么,比如test中的name就表示对象中封装的属性名字,而中间左边的name表示employee表中的字段,右边还是表示对象封装的属性。这里我们封装了一个LoginDTO的对象用于接收账号密码,将DTO传给Service让他处理,service返回的是employee对象因为在《苍穹外卖》中,虽然 Service 查出来的是 Employee,但 Controller。所有Employee的操作就在这里了,虽然不是很清楚希望会越来越好。

2025-12-27 00:10:01 865

原创 二叉排序树

考察二叉搜索树的插入,例如有2 3 5 现有插入4,需要插入到3,5之间,然后3,5又有可能是3在5上或者5在3上。4总是插入在层次更深的节点下边,所以我们需要开一个map存储层数,顺便由于map是有序的所以插入的时候可以用二分查找到插到哪个数下。

2025-03-22 13:16:58 158

原创 二叉树遍历

同样,本题是给出二叉树的前序遍历和中序遍历求后序遍历,本题由于直接给的就是字符串,所以比给节点值的会好很多,因为不需要哈希表了,string自带了find函数。求后序和求前序本质就是一样的,区别在于输出/更新是在递归之前还是递归之后。

2025-03-22 13:13:25 150

原创 前序遍历~

经典的二叉树遍历,由中序和后序遍历构造出二叉树从而找出前序遍历,但是这种题一般不需要建树,可以直接找到。我们知道后序遍历的最后一个结点就是树的根节点,而根节点在中序遍历中将左右子树分割。利用这一特性我们就可以重建树,而前序遍历是先根后左右。由于题目要输出前序遍历的最后一个数字,所以需要每次递归都进行更新。

2025-03-22 13:10:32 251

原创 根能抵达的点

check如何写呢,check本质就是判断根节点到节点的数目是否不超过Y。本题关键就在代码的实现和二分的思维。本题要求找一个最小的非负整数x,这个x实际就是边权,这里想到二分边权的简直就是天才。我们二分边权然后check一下是否满足条件。

2025-03-16 19:52:28 162

原创 判断素数~

由于n最大只有10000,其实埃氏筛和普通筛都行,但是线性筛最好是背过,所以线性筛后有一个素数数组,由于数组是单调增的所以查找的话可以用二分查找,所以总的时间复杂度是O(n)的非常轻松。这里我们的二分查找应该是查找>=x的第一个数,所以采用lower_bound()

2025-03-15 13:31:05 139

原创 二元组整数

本质就是选两个数,但是要按照字典序输出,也不能要相同的二元组,所以我们想到了排序+去重。

2025-03-15 13:24:33 245

原创 链表合并(数组做法)

拿到题目,两个升序链表要求合并,第一时间想到了归并排序的二路归并,简直是天生为了这个设计的题目。我们没必要管链表,就用数组存也是可以的。二路归并,定义两个指针分别指向两个数组的头部,比较大小,将小的存入新数组,直至一个数组遍历完,后面数组接上就好了。

2025-03-15 13:02:04 151

原创 删除字符串

本质就是模拟,删除含有gzu的子串,由于不区分大小写,所以默认将所有的gzu转换成小写进行判断。由于字符串长度不超过100,所以直接遍历就好了,每次取出长度为3的子串进行判断,如果符合的话就跳过,如果不是gzu的话就输出当前遍历到的字符。

2025-03-15 12:59:35 297

原创 围圈报数~

经典的约瑟夫环问题,定义一个队列就可以解决了,由于每次输出的都是报3的人,所以前面两个人先出队,后重新入队,第三个人就出队报数就好了,以此往复,直至队列为空。

2025-03-15 12:56:21 249

原创 安全密码(模拟)

条件有四个,大小字母,数字,以及其他,关于大小写字母和数字我们其实是有一个判断函数的不需要自己再去实现了,判断大写字母是 isupper()函数,小写字母是islower(),数字是isdigit(),还有一个函数是判断是否是字母的就是没有分的那么细 isalpha()纯模拟题,以及考察对于字符串的处理,有实现的细节需要注意,以及记住几个常用的函数方便写代码。首先可以先判断密码的长度如果<8了直接continue了,其次才是判断是否满足条件。

2025-03-15 12:54:16 227

原创 惠民工程(最小生成树)

求最小生成树有两种做法一个是kruskal算法,开始一个是prim算法,本题采用kruskal算法,算法的核心需要采用并查集。初始化时,每一个点都是在各自的集合中,首先将所有的边权从小到大排序,每次选中一条边,如果这条边的两个点不在一个集合中,就给他们加入同一个集合,并且将ans加上这条边权,遍历完所有的边就是答案了。本质也算是一种贪心做法。

2025-03-15 12:50:08 248

原创 好坑的电子地图(最短路问题)

本质就是求起点到终点的最短路问题,图论中的最短路一般有两种情况,一种是带负权边的,一种是非负权边的问题,本题显然是非负权边的问题,但是他在以往的基础上还多给了条件,就是出发的时候需要看地图,且奇数和偶数看的时间不一样,这里我们其实可以把多出来的时间直接算到边权里边就好了,在输入的时候处理一下,用dijkstra做就好了。本题采用邻接表存储图,注意这里是无向图。

2025-03-15 12:44:36 189

原创 数字~~~~(枚举题)

第一个想法就是遍历一下字符串给每一个出现的字符进行++操作,现在问题就是拿什么数据结构操作,如果只是用数组的话,查找的话还要o(n)就比较慢了,所以这里选择用哈希表存储,这样也能在边遍历字符串的时候,记录答案。题意非常的简单,给字符串,统计字符串中出现最多的字符,且这个字符串比较特殊是0~9组成的。

2025-03-15 12:26:18 223

原创 二进制数(去前导0版本)

本题值得注意的点:unsigned int 以及除去前导0,我们先讨论有前导0的写法,有前导0本质就是将int的32位遍历一遍找出一个位是什么,去掉前导0的话就是找到最后一个1,其实是一个while每次右移一位直到为0 即可,本题还有一个坑,就是输入可能为0,但是0进不了while循环,所以需要特判一下。以及我们用字符串存储答案,但是字符串存储的是反着的,所以需要reverse一下字符串。

2025-03-15 11:55:32 276

原创 哈夫曼树~

本题给我们n个节点要我们求其构成的哈夫曼树的带权路径长度,这个一般有两种求法,书面上的。求每个叶子节点的路径长度✖权值并且相加,或者将每一个非叶子节点的权值相加即为答案。由于哈夫曼树是每次合并最小的两个节点,所以我们需要用到一个数据结构——堆。每次将取出堆顶的两个元素,并且合并,合并后可以将它理解为一个新节点,直至堆中只有最后一个节点。每次合并出的一个节点必是非叶子节点所以我们定义一个ans每次加上即可。代码实现第二种的更为方便,因为第一种需要求路径长度。

2025-03-15 11:49:04 182

原创 加油站~~

求最少加油次数就是一个贪心问题,这里也不需要证明,根据我们的常识也知道就是走到油不够的时候就加油就好了,这里的no solution这有在两个加油站之间的距离大于了加满油后的行驶距离才会存在,其他情况都是可以计算的。代码有很多细节需要注意下。

2025-03-14 18:11:14 296

原创 机器人走迷宫

本题其实就是模拟,和bfs没啥关系但是可以借鉴bfs的代码细节。

2025-03-14 18:02:12 293

原创 巨人排队~

题目的意思就是排队要按照高到低排,但是小朋友开始排队的顺序是固定的,且排好就不动了,问最少要多少个队才能满足这样的要求。仔细想想就是贪心问题,其实也是一个常识问题,排队的人找到所有队列中大于等于他身高的最接近的那个队列。这样排队的话,我们只需要开一个数组,存储每个队列目前最后的人的身高。最后数组的长度就是最少的队伍数量,最重要的一点就是这个数组他是单调增的,因为要开第二个队的原理是第一个队的最后一位比当前要排的人矮。所以我们可以采用二分查找优化所以总的时间复杂度就是nlogn可以过。

2025-03-14 17:54:15 203

原创 走路还是坐公交

由于走路和坐公交所需要的时间都是1分钟,这个1分钟可以看作从x到x+1这种的权值,所以它们的权值是相同的,所以可以采用bfs找最短距离。

2025-03-14 17:00:58 194

原创 中南a+b问题

本质是字符串处理问题,这里我们需要搞清楚cin与getline的区别,cin碰到空格和回车都会结束读取,而getline只有碰到回车的时候会结束读取,所以一般我们在读取有空格的字符串时采用getline。本题不一样,本题仔细观察,数字的英文都被空格所隔开了,所以我们正好利用cin的这个特性将两个加数取出。

2025-03-14 16:56:52 228

原创 平方朋友对

从A找B会超时,因为A的范围是10的6次方,但是看B的范围要开根号,B最大应该是(maxA+n-1)*1000+999开根号范围在300000左右,所以我们从B开始找A,那么还得看看B的最小是多少,因为一定要在A的末尾添三个数字且A>=1所以A最小是1000那么其对应的B就应该是根号1000推出B应该是>=32,因为32的平方就是2的十次方也就是1024。

2025-03-10 16:27:10 190

原创 寻找重复数

这题真是一个很好的二分题目,打破了往常的思维,二分不是二分数组的下标,而是二分1~n的取值范围。好比mid=1+n>>1,如果数值范围1~mid中没有重复的数那么小于等于mid的数最多有mid个,如果大于了mid说明1~mid中有重复的数。

2025-03-04 14:59:40 154

原创 多数元素~

出现次数大于n/2说明这个数是最多的,遍历整个数组,用一个cnt记录一下当前出现最多的数。用哈希表存储每个数的出现次数,每次进行更新。

2025-03-04 14:28:41 172

原创 电话号码的字母组合

长度最大为4,所以用暴搜就好了,先将数字对应的字符串存储下来。

2025-03-04 14:24:51 183

原创 最小覆盖子串

需要理解涵盖这样操作如何判别,还是一样用两个数组,一个数组存t串的所有字符,另一个数组用来双指针遍历s判断涵盖否。遍历的过程中更新最小的涵盖长度。

2025-03-04 14:22:05 175

原创 滑动窗口的最大值

单调队列的常见问题,假设有一个窗口大小为3,求其中的最大值,先将数组的前三个数存入队列,找最大值需要o(k),再挪动再找,找完需要o(nk)的复杂度若k是n/2那么复杂度还是会达到o(n2)。想想如何优化,用队列,第一个数进入,进入第二个数的时候如果第二个数比第一个数大的话,第一个数是不是就没有用了,因为后面的最大值也不会是第一个,第一个窗口的最大值也不会是第一个数,所以我们直接将第一个数出队。这样每次移动的时候判断队列中的第一个数就是窗口的最大值。

2025-03-04 14:14:18 149

原创 和为k的子数组

看到子数组再看到求和,就应该很清晰的想到前缀和。前缀和是处理该问题的一种非常有效的手段。求解子数组之和等于S[r]-S[l]==k,本质和求两数之和的做法是一样的,用哈希表存储前缀和数组。

2025-03-04 14:04:49 199

原创 找到字符串中所有的字母异位词

异位词即子串的所有排列,本质就是里面的字母都一样,本题是定长滑动窗口问题,窗口大小就是p串的长度,每次判断窗口中的子串是否符合p串的异位词。用两个int数组存储各是什么字符,即26个字母用ascii🐎。

2025-03-04 13:59:50 207

原创 无重复字符的最长子串

可以用滑动窗口在做,每次向前滑动,窗口里不含有重复的字符,窗口的最大值就是子串的最大长度。需要用unordered_set<char>来存储窗口中的字符。

2025-03-04 13:53:29 195

空空如也

空空如也

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

TA关注的人

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