工作准备
miss writer
我也可以成为大佬,为世界开源做贡献。冲!!!
展开
-
多问为什么
先欠着,回头更新!原创 2024-09-27 18:30:15 · 306 阅读 · 0 评论 -
关于悲观锁和乐观锁的为什么
2.乐观锁比悲观锁更节省资源,那为什么要用乐观锁?4.悲观锁什么时候升级,如何升级?1.为什么需要悲观锁和乐观锁。3.悲观锁为什么要锁升级?原创 2024-09-27 17:41:13 · 129 阅读 · 0 评论 -
走迷宫变体【拼多多1面0905】
有一个N*M的迷宫,主角被放在随机的位置上,给你一个函数,控制主角逃离迷宫。可以使用的函数:int move(String direction) (//direction代表上下左右四个方向,分别是“U"、“D"、“L"、“R"//返回值有3种,包括-1、0、1;-1表示前面是陷阱或墙,主角不能往前走,会留在原地;0表示迷宫出口,恭喜成功逃离;输出:若找到出口,则移动到出口位置并输出”Y”;若没有可逃离的路线,则输出”N"。这里我事后考虑是这样解的,还有个问题是如何判断走回头路?原创 2024-09-05 22:18:10 · 276 阅读 · 1 评论 -
单点登录问题【拼多多0905一面】
这里我思考后给出的解决办法:在用户第一次登录成功后,还要把(用户id:uuid)作为hashmap存入Redis,用户在其它设备登录后,会先判断Redis中有没有uuid,然后根据uuid获取用户密码,同时此次会使用新生成的uuid作为key,将上次的uuid替换掉(当然不替换增加uuid也可以,然后定时删除。刚开始状态真的很差,大脑思考不动,面试中2个手撕,做出来一个,两个项目问题,没有八股。单点登录中,如何保证用户在不同设备上登录时,能够知道在另一个设备已经登录了。希望大家给出不同的解法。原创 2024-09-05 21:26:46 · 360 阅读 · 0 评论 -
协同开发工具Git
非常不建议直接在安装路径下使用初始化仓库,换句话说,git init 路径,这个路径最好是空文件夹,避免出现访问权限错误的问题。这应该是每个初学者都会犯得错误,当出现这种错误还是比较好排查出来的,一般提示命令不正确时就要注意检查关键字哦!网上对于Git的使用方法介绍的很多,在日常工作中,Git是团队开发必不可少的工具之一,我想为一些。解决办法:首先退出到.git目录外,查找已有工作数目录。,查找你要操作工作树路径以及切换到正确的工作树目。的小伙伴们介绍一下常遇到的小问题。进入目录,进行后续操作。原创 2024-09-03 16:21:38 · 510 阅读 · 0 评论 -
装饰器模式及应用【理论+代码】
Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。责任分离:装饰器模式将系统的不同功能分离开来,每个装饰器类负责特定的功能扩展。装饰器模式提供了一种灵活的替代继承的方法来扩展对象的行为。通过添加新的装饰器类,可以轻松地为现有对象添加新功能,而不需要修改原有代码。低耦合性:装饰器模式通过组合而非继承来扩展功能,减少了类之间的依赖关系。可以通过添加新的装饰器来扩展系统功能,而不需要修改现有代码。装饰器:持有一个组件对象的引用,并定义一个与组件接口一致的接口。原创 2024-08-31 22:16:03 · 729 阅读 · 0 评论 -
0829二面中一个问题
在Spring框架中,如果一个@Controller类实现了InitializingBean接口,那么它的afterPropertiesSet方法会在Spring容器完成该Bean的所有属性注入之后被调用。默认情况下,如果Bean的初始化失败,容器可能会记录这个异常并继续尝试创建Bean,或者可能会标记这个Bean为失败状态。如果Spring容器因为某些原因关闭并重新启动,所有的Bean,包括@Controller,将被重新创建,并且它们的afterPropertiesSet方法将再次被调用。原创 2024-08-30 11:09:55 · 437 阅读 · 0 评论 -
美团一面部分问题
每当一个方法被调用,一个栈帧(stack frame)就会在栈中创建,用于存储该方法的信息,当方法执行完毕,栈帧也会被移除。生命周期:栈中的数据具有确定的生命周期,当一个方法调用结束时,其对应的栈帧就会被销毁,栈中存储的局部变量也会随之消失。堆的存取速度相对较慢,因为对象在堆上的分配和回收需要更多的时间,而且垃圾回收机制的运行也会影响性能。存储空间:栈的空间相对较小,且固定,由操作系统管理。可见性:栈中的数据对线程是私有的,每个线程有自己的栈空间。堆中的数据对线程是共享的,所有线程都可以访问堆上的对象。原创 2024-08-25 21:24:14 · 885 阅读 · 0 评论 -
校园课程助手【9】-暂时完结撒花版
对此项目做一个阶段性总结,后续有新的优化会继续更新。原创 2024-08-06 12:22:59 · 252 阅读 · 0 评论 -
力扣170【交易逆序对的总数】
在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。两两归并到四四归并,这个过程就可以用来记录逆序数。这题不看题解真没想到用归并排序的原理做,说明对于归并排序没有真正意义的理解。输入:record = [9, 7, 5, 4, 6]原创 2024-08-05 20:02:45 · 312 阅读 · 0 评论 -
力扣41【缺失的正数】
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。原创 2024-08-05 12:09:54 · 353 阅读 · 0 评论 -
校园课程助手【8】-RabbitMQ实现异步选课
RabbitMQ实现异步抢课原创 2024-08-05 11:17:48 · 398 阅读 · 0 评论 -
力扣287【寻找重复数】
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。假设 nums 只有 一个重复的整数 ,返回 这个重复的数。脑子不好使了,只能这样解决了!原创 2024-08-04 20:54:32 · 245 阅读 · 0 评论 -
力扣240【搜索二维矩阵2】
右上角元素是所在行的最大值:如果目标值大于右上角的元素,那么目标值肯定不在当前行,因此我们可以向下移动到下一行。编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。右上角元素是所在列的最小值:如果目标值小于右上角的元素,那么目标值肯定不在当前列,因此我们可以向左移动到前一列。比较好玩的一题,上来一下被吓到了,找不出规律。看了题解,还真有规律,其实本质还是一种二分查找,只是比较值并不是中点,而是矩阵的右上角,为什么呢?每列的元素从上到下升序排列。原创 2024-08-04 16:08:45 · 208 阅读 · 0 评论 -
校园抢课助手【7】-抢课接口限流
接口限流常用策略原创 2024-08-03 22:44:35 · 818 阅读 · 0 评论 -
校园选课助手【6】-使用验证码验证抢课接口
3.CourseOrderservice中编写验证码检验逻辑代码,使用的是数字验证码,用户输入结果后传入与Redis中预存的结果进行比较。需求分析:抢课开放时,大量用户同时访问抢课接口,防止有人利用程序恶意刷接口进行抢课。原创 2024-08-03 21:09:59 · 234 阅读 · 0 评论 -
校园选课助手【5】-解决Elasticsearch和MySQL同步
Elasticsearch实现课程查询原创 2024-08-02 21:01:09 · 485 阅读 · 0 评论 -
校园课程助手【4】-使用Elasticsearch实现课程检索
3.在项目中建立elasticsearch.document和elasticsearch.repository包,用于存放elasticsearch文档类和接口操作。4、在repository包下新建操作Elasticsearch的接口继承ElasticsearchRepository。5.在service包下新建Elasticsearch商品搜索Service类EsCourseService。6.在dao包下新建操作数据库接口EsProductDao和映射xml文件EsProductDao.xml。原创 2024-08-02 12:12:28 · 1027 阅读 · 0 评论 -
校园课程助手【3】-使用枚举类封装异常优雅处理全局异常
首先:在本项目中,所有的Controller类返回给前端控制器的都是ResBean对象,下面是这个类的实现,属性包括返回代码,提示信息以及一个Object类。这样使用枚举类优雅的封装异常信息,通过自定义异常类型,最后交给全局异常类处理就可以啦啦啦啦啦!最后:介绍本项目使用上述枚举类封装一个优雅的 Spring Boot 全局异常处理的过程。原创 2024-08-01 22:00:03 · 424 阅读 · 0 评论 -
校园选课助手【2】-重要的登录模块
1.使用 MD5 二次加密用户登录信息,前端先通过密码加上盐进行MD5加密交给服务器,在userSeverice验证时再对此密码加盐进行一次MD5加密才和数据库中查询的密码对比;两种方法获取用户登录信息,一种是通过获取Redis里存储的用户信息;登录验证的service代码: 随机生成一个uuid作为key,将用户登陆信息使用Redis存储,将key作为cookie返回。实现自定义拦截器方法:实现WebMvcConfigurer 接口,使得springMVC调用服务接口时进行用户身份解析。原创 2024-08-01 15:48:00 · 659 阅读 · 0 评论 -
校园选课助手【1】-项目整体架构从此开始
后端:Spring MVC、Mybatis、Redis、RabbitMQ、MySQL、Elasticsearch。课程查询:用户可按课程名称、课程代码、教师姓名等条件查询课程信息。课程表:包含课程名称、课程代码、教师姓名、学分、课时、余量等信息。选课表:包含选课ID、用户ID、课程ID、选课状态等信息。软件开发:包括需求分析、设计、编码、测试和部署等环节。个人中心:用户可查看已选课程、课程表、成绩等信息。用户表:包含用户ID、用户名、密码、手机号等信息。功能性:满足学生选课、退课、查询课程信息等需求。原创 2024-08-01 11:11:03 · 1012 阅读 · 0 评论 -
力扣134【加油站】
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。如果存在解,则 保证 它是 唯一 的。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。原创 2024-07-31 11:42:03 · 154 阅读 · 0 评论 -
力扣376【摆动序列】
求最长摆动序列时:当求up[3]时,由于3 > 2,可知up[3]只能=up[2]或者down[2]+1中选最大的;而求up[4]时,由于2<3,up[4]=up[3]相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。有序列:1 2 3 2。原创 2024-07-30 19:36:20 · 686 阅读 · 0 评论 -
力扣402【移掉k位数字】
给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。思路:维护一个递增的单调栈,保证栈内元素从头到尾是增加的;原创 2024-07-30 12:01:42 · 222 阅读 · 0 评论 -
两种经典的索引优化方式
在这个例子中,由于order_date和amount列都在索引idx_order_date_amount中,数据库可以直接从索引中获取查询所需的所有数据,而无需访问orders表本身。由于电子邮件地址通常很长,且具有一定的规律性(即“用户名@域名”),如果我们为整个email字段创建索引,则会占用大量空间,并且可能不会那么高效。换句话说,如果你有一个查询只需要读取索引中的数据,而无需访问数据表本身,那么这个索引就是一个覆盖索引。对于某些类型的查询,可以减少数据库的I/O操作,因为只需要读取索引。原创 2024-07-29 22:33:22 · 366 阅读 · 0 评论 -
力扣227【基本计算器】
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。这题跟上一个题很像,但由于我想用Deque,对出队的函数不熟悉导致一直没排查到bug。s 由整数和算符 (‘+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()。给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内。原创 2024-07-26 16:32:35 · 236 阅读 · 0 评论 -
力扣224【基本计算器】
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()。‘+’ 不能用作一元运算(例如, “+1” 和 “+(2 + 3)” 无效)‘-’ 可以用作一元运算(即 “-1” 和 “-(2 + 3)” 是有效的)给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。s 由数字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 组成。每个数字和运行的计算将适合于一个有符号的 32位 整数。输入中不存在两个连续的操作符。s 表示一个有效的表达式。原创 2024-07-25 19:25:17 · 365 阅读 · 0 评论 -
力扣86【分割链表】
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。最近在速刷算法题:刷题链接如下。原创 2024-07-23 15:51:40 · 336 阅读 · 0 评论 -
最详细的建立二叉树的代码【深搜和层次遍历实现】
采用深搜时:上述输入[5,4,8,11,null,null,13,4,7,2,null,null,null,null,5,1]采用层次时:上述输入[5,4,8,11,null,13,4,7,2,null,null,5,1]上述代码可以直接运行,举个例子说明输入。注意选取何种建树方法取决输入形式。原创 2024-07-16 21:55:56 · 210 阅读 · 0 评论 -
Spring注解的实现原理【简单实现一个注解】
注解本身是通过@interface关键字定义的一个特殊接口,使用反射API,如Class.getAnnotation()、Method.getAnnotation()等,可以获取到指定程序元素上的注解实例。当我们通过反射API获取注解时,实际上返回的是一个代理实例,这个代理实现了注解接口,并覆盖了接口中定义的所有方法。当这个注解被用在Java代码中时,它可以提供声明式的验证,使得代码更加清晰,易于维护。添加元注解:使用元注解(如@Target和@Retention)来定义注解的作用域和生命周期。原创 2024-07-16 18:58:47 · 303 阅读 · 0 评论 -
力扣207【课程表】
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。正确代码如下:按a->b记录边,同时记录每个节点的入度,判断是否可行时要求此节点的入度为0,同时以此节点为头的边界点入度减一,满足入度为0继续入队。先贴一下错误代码:(思路,使用map存储有入度的节点,将入度为0的点入队,出队的点为前置节点,遍历数组判断加入后置节点)你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。上述代码的问题,无法处理有环出现的情况。原创 2024-07-14 10:15:00 · 213 阅读 · 0 评论 -
动态代理实现AOP技术【代码演示】
AOP技术利⽤"横切"技术,剖解开封装的对象内部,并将那些影响了多个类的公共⾏为封装到⼀个可重⽤模块,并将其命名为"Aspect",即切⾯。所谓"切⾯",简单说就是那些与业务⽆关,却为业务模块共同调⽤的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。3、连接点(joinpoint) 被拦截到的点,因为Spring只⽀持⽅法类型的连接点,所以在Spring中连接点指的就是被截到的⽅法,实际上连接点还可以是字段或者构造器。2、切⾯就是对横切关注点的抽象。原创 2024-07-15 10:30:00 · 182 阅读 · 0 评论 -
作业帮笔试1【简单版接雨水】
已经做过接雨水的题解,本题略有不同,描述是给定一个数组,每个值代表对应坐标的高度,从中选择两个坐标,与x轴组成的容器能接最多的水。算法:使用双指针从两边选取,哪一边坐标低哪一边移动。每次计算结果与最大值对比。输入是字符串形式【1,2,3】需要自己转换成数组。原创 2024-07-12 20:59:08 · 234 阅读 · 0 评论 -
NIO(NO-Blocking I/O)模型
处理事件: 在⼀个循环中调⽤ Selector 的 select() ⽅法,该⽅法会阻塞直到⾄少⼀个注册的 Channel发⽣了感兴趣的事件。注册 Channel 到 Selector: 通过 Selector 监听⼀个或多个 Channel ,当 Channel 上发⽣感兴趣的事件时, Selector 将通知程序;Selectors(选择器):如果应用需要处理多个通道,选择器可以监控多个通道的 I/O 事件,如连接请求、数据到达等。Buffers(缓冲区):是数据容器,用于存储不同类型的数据。原创 2024-07-12 11:33:19 · 917 阅读 · 0 评论 -
7.10飞书一面面经
B+树的⾮叶⼦节点不存放实际的记录数据,仅存放索引,所以数据量相同的情况下,相⽐存储即存索引⼜存记录的 B 树,B+树的⾮叶⼦节点可以存放更多的索引,因此 B+ 树可以⽐ B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。主从复制:单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,可以搭建主从集群,实现读写分离。B+ 树有⼤量的冗余节点(所有⾮叶⼦节点都是冗余索引),这些冗余索引让 B+ 树在插⼊、删除的效率都更⾼,⽐如删除根节点的时候,不会像 B 树那样会发⽣复杂的树的变化;原创 2024-07-10 22:41:59 · 1341 阅读 · 0 评论 -
7.10飞书一面
面试官人很好,不断地帮助我代入状态,自己在知识点上面花的时间还不够,算法比较简单A了,找时间写下面经。首先,太紧张很多问题能答得更好,大脑混在一起,语音比较紊乱。算法:求一个数组的峰值(大于左右相邻元素即可)。2、优化,使用二分查找降低到logn复杂度。2、介绍一下Mysql的索引?说一下验证码实现验证的逻辑;3、说一下Redis集群。1、Redis为什么快?用到线程池是自己搭的吗?1、直接遍历进行比较。原创 2024-07-10 17:21:16 · 447 阅读 · 0 评论 -
力扣215 数组中第k大的数
算法:由于数组最大范围是10000,存在负数。申请一个20000的数组,将原数组的数作为新数组下标(+10000因为存在负数),然后从后往前减,求出第K大的数。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。本题主要考察各种排序算法,要求时间O(n),严格意义上说只有计数排序满足条件。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。原创 2024-07-10 11:04:17 · 333 阅读 · 0 评论 -
软件工程常见知识点
最终,选择最佳设计是一个权衡的过程。作为一名架构师,我们需要具备广泛的技术知识、敏锐的业务洞察力和良好的沟通能力,以确保系统能够满足用户和业务的需求。首先,模块化是我们的基石,通过将系统拆分成独立的、职责明确的模块,我们可以灵活地替换和升级各个部分,而不影响整个系统。在设计验证阶段,我们将组织设计评审会议,让团队成员和利益相关者对设计进行评审,并通过原型验证设计的可行性和有效性。其次,采用服务化架构,比如微服务,可以让我们按需扩展特定服务,而不必对整个系统进行扩展,这大大提高了资源利用率和系统的响应速度。原创 2024-07-08 21:59:31 · 2682 阅读 · 0 评论 -
力扣394 字符串解码
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。算法:使用栈模拟解码规则,遇到】就考虑最近的字符串次数,依次往最外层处理。给定一个经过编码的字符串,返回它解码后的字符串。原创 2024-07-08 15:27:03 · 187 阅读 · 0 评论 -
线程池实战【多线程实时转录语音】
对电话进行监听,有电话接入首先判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队 列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任 务。如果已经满了,则交给拒绝策略来处理这个任务。ThreadLocal用于在每个线程中存储独立的变量副本,这样每个线程都可以独立地访问和修改自己的变量副本,而不会相互干扰。原创 2024-07-07 17:20:09 · 273 阅读 · 0 评论