- 博客(162)
- 问答 (1)
- 收藏
- 关注
原创 《设计模式》抽象工厂模式
抽象工厂模式(Abstact Factory ): 提供一个创建一系列相关或者相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式(Abstact Factory ): 提供一个创建一系列相关或者相互依赖对象的接口,而无须指定它们具体的类。
2025-08-17 20:50:42
440
原创 《设计模式》工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。通常我们把被创建的对象称之为【产品】, 创建【产品】的对象称为【工厂】。当产品比较固定且数量少的情况下,只需要一个工厂类就可以,称之为【简单工厂】, 多个工厂时,就称为工厂方法模式,其中工厂方法使一个类的实例化延迟到其子类,而简单工厂实例化就是在唯一工厂类。
2025-08-17 18:06:53
859
原创 《设计模式》装饰模式
装饰模式(Decorator) ˈdekəreɪtər:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活动态地将职责动态附加到对象上。想要扩展功能, 装饰者提供有别于继承的另一种选择。要点1、继承属于扩展形式之一,但不见得是达到弹性设计的最佳方案。2、在我们的设计中,应该允许行为可以被扩展,而不须修改现有的代码。3、组合和委托可用于在运行时动态地加上新的行为。4、除了继承,装饰者模式也可以让我们扩展行为。
2025-08-16 17:39:54
745
原创 《设计模式》策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一组算法,将每个算法封装起来,并使它们可以相互替换,从而让算法的变化独立于使用它的客户(Client)。换句话说, 策略模式让一个类的行为或其算法可以在运行时更改,而不会影响使用该类的代码。策略模式核心思想: 定义一组算法,让它们可以互相替换,而不会影响客户端代码。适用于: 需要多个可替换算法,并希望避免 if-else 逻辑的场景。优点: 符合开闭原则,可动态切换策略,避免冗长 if-else。
2025-08-10 22:43:25
982
原创 《设计模式》紧耦合和松耦合
耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。假如:当我去new一个对象的时候,而这个对象不存在,这个时候程序会报编译时异常,也就意味着程序连运行都运行不了,我们可以理解为他们的耦合度较高。内聚性是一个和耦合性相对的概念,一般而言低耦合性代表高内聚性,反之亦然。耦合性和内聚性都是由提出结构化设计概念的赖瑞·康斯坦丁所提出。
2025-08-10 17:44:23
388
原创 《设计模式》UML类图
关联和聚合的区别主要在于语义上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。聚合和组合的区别则在语义和实现上都有差别:组合的两个对象之间生命周期有很大的关联,被组合的对象在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁,一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象;聚合则不一样,被聚合的对象可以属于多个聚合对象。
2025-08-10 17:30:07
307
原创 《程序人生》工作2年感悟
6.学习是一个持久性过程,要注重平时的积累,多写写博客,多敲敲代码,多看看书籍,要有持续学习的能力。7.要重复造轮子,这个过程能够将自己的想法实践出来,会遇到各种各样的难题,也会从中获取很多。3.要常怀感恩的心,要记住帮助过你的人,愿意和你分享的人,有能力的时候不要忘记帮助别人。8.要有职业生涯规划,要有技术学习体系,一张白纸如何画出蓝图,全凭自己的路如何走了。4.机会很重要,不要轻易放弃一些你觉得不重要的东西,其实那些东西也很重要。9.享受生活,享受工作,享受与人交往的过程。
2025-01-27 10:10:45
3967
1
原创 《职场话术》如何处理职场刁难
是是是,这事确实是我没有做好,希望刘总能多把把关,我也多学点经验,下次我也能做好。好的,领导,我马上去改,回头我给旭东说一声,这样的问题下次一定不能再犯了,哦我发了你可能没看见,不过没关系,我再给你发一遍。好的,但是我的事情超多,可以和我师父协调一下,行动 + 提及责任人 + 承诺。接受 + 拖拖拖 + 领导挡锅。提示 + 谅解 + 外部执行。这些话可不好乱说,证据呢,
2023-07-09 23:03:12
413
原创 《MAC》Pycharm远程连接服务器并调试代码
之前一直是使用jupterNotebook去实现远程访问服务器,后来觉得查找代码不是很方便,于是就选择了使用pycharm去处理这个问题。主要过程是参考这个博客,这里主要是记录几个问题。1.Error running ‘train’: Cannot run program “sftp://***@***/data/anaconda3/bin/python3.7” (in directory “/Users/Desktop/mtad-gat-pytorch-main”): error=2, No suc
2021-12-21 16:39:32
1622
1
原创 秋招总结(2021)
实习: 实习是在华为实习的,主要是做了两个项目,一个是NLQ模型的中文迁移,一个是Spark任务的日志解析和指数丰富。哈哈,做的还挺全面,无论后端还是算法任务都有接触到,整体来说,算法很有挑战性,我当时只是把最基础的给复现了一下,基于整体框架做了一个优化,最后准确率达到了40%多,也很荣幸拿到了榜单的前6名,但是对于具体的实习细节没有太多的关注。后来老大又提出了一种方法,又优化了很多。以前说实在的,了解过很多职场的东西,但是后来经过接触,才发现其实就程序员大多数都是很真诚的,都是愿意解决问题的。实习经历
2021-11-09 15:08:05
322
原创 《leetcode》约瑟夫环《数学》
剑指 Offer 62. 圆圈中最后剩下的数字难度简单4480,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2限制:1 <
2021-09-27 18:46:59
241
原创 《leetcode》剪绳子(I,II)《动态规划》
剑指 Offer 14- I. 剪绳子难度中等300给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 3
2021-09-26 16:43:30
240
原创 《leetcode》寻找旋转数组中的最小值(I,II)《二分查找》
153. 寻找旋转排序数组中的最小值难度中等568已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ...,
2021-09-26 15:28:16
316
原创 《leetcode》剑指 Offer 07. 重建二叉树(前序中序)《树》
剑指 Offer 07. 重建二叉树难度中等567输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例 1:Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:Input: preorder = [-1], inorder = [-1]Output: [-1]限制:0 <
2021-09-26 14:52:17
250
原创 《leetcode》旋转矩阵《模拟》
54. 螺旋矩阵难度中等870给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m == matrix.lengthn == matri
2021-09-26 13:29:56
248
原创 《leetcode》两数之和,三数之和,四数之和《双指针》
1. 两数之和难度简单12203给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [
2021-09-26 12:46:55
193
原创 《leetcode》146. LRU 缓存机制(两种方式)《双向循环链表》
146. LRU 缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,
2021-09-12 08:02:48
233
转载 《基数排序》基数排序详解
一、基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作。基数 排序是一种按记录关键字的各位值逐步进行排序的方法。此种排序一般适用于记录的关键字为整数类型的情况。所有对于字符串和文字排序不适合。(O(d(n+k))* : n个d位数,取值范围[0,k],对于每一位,耗时O(n+k), 稳定排序)实现:将所有待比较数值(自然数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变
2021-09-11 16:23:30
2194
转载 《堆排序》堆排序详解
堆排序堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图://大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] //小顶堆:arr[i] <= arr[2i+1] &&
2021-09-10 13:49:17
4697
原创 《leetcode》645. 错误的集合《位操作》
645. 错误的集合难度简单213集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。示例 1:输入:nums = [1,2,2,4]输出:[2,3]示例 2:输入:nums = [1,1]输出:[1,2]提示:2 <= nums.
2021-07-04 22:29:49
311
1
原创 《leetcode》剑指 Offer 51. 数组中的逆序对《归并排序》
剑指 Offer 51. 数组中的逆序对难度困难427在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000解析: 归并排序, 如果mid之后的数排到前面了,那么re+=这个数原来位置之前的比他大的数的个数。模板题。时间复杂度O(nlogn) 空间复杂度 O(n)代码:class Solution {
2021-06-03 20:08:28
213
原创 《leetcode》剑指 Offer 19. 正则表达式匹配《动态规划》
剑指 Offer 19. 正则表达式匹配难度困难231请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例 2:输入:s = "a
2021-06-03 19:19:14
234
原创 《leetcode》剑指 Offer 60. n个骰子的点数《动态规划》
剑指 Offer 60. n个骰子的点数把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例 2:输入: 2输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667
2021-06-01 16:06:58
190
原创 《2021春招复习10》Redis《Redis》
1、简述下Redis☆Redis是一个开源的使用C语言编写,可基于内存,可持久化的Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串),list(链表),set(集合),Zset(sorted set—有序集合),和hash(哈希类型)。优势:速度快,性能极高,可持久化,丰富的数据类型,支持数据备份。Redis和Memcached的区别:1、类型Redis是个开源的内存数据结构存储系统,用作数据库,缓存和消息代理。Memcached
2021-05-25 14:39:39
208
1
原创 《2021春招复习12》操作系统《操作系统》
1、线程,进程和协程的区别☆线程是指进程内的一个执行单元,也是进程内可调度的实体。1、线程和进程的区别线程进程拥有资源不拥有资源,但是可以访问隶属进程的资源资源分配的基本单位调度独立调度的基本单位,比进程更小的独立运行基本单位cpu调度和分派的基本单位系统开销开销小,线程切换只需保存和设置少量寄存器内容。开销大,创建和撤销时,都需要为之分配资源或回收资源如内存空间,I/O资源等,进行进程切换时,涉及当前执行进程CPU环境的保存及新调度进程CPU环境的设置
2021-05-25 14:12:40
209
1
原创 《2021春招复习9》数据库《MySql》
1、数据库的ACID特性(1)原子性(Atomicity)事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全被失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些操作即可。(2)一致性(Consistency)数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。(3)隔离性(Isolation)一个事务所做的修改在最终提交之前,对其它事务不可见。(4)持久性(Durability)一旦事务提
2021-05-11 22:17:55
216
原创 《2021春招复习8》JUC(java util concurrent)《Java并发》
14、简述线程池 ☆ThreadPoolExecutor线程池及线程扩展策略1、为什么要用线程池? **降低资源消耗。**通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 **提高响应速度。**当任务到达时,任务可以不需要等待线程创建就能立即执行。 **提高线程可管理性。**线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。2、JUC中的线程池体系ThreadPoolExecutor类和ScheduledTh
2021-05-11 22:02:13
189
原创 《2021春招复习9》数据库《MySql》
1、数据库的ACID特性(1)原子性(Atomicity)事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全被失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些操作即可。(2)一致性(Consistency)数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。(3)隔离性(Isolation)一个事务所做的修改在最终提交之前,对其它事务不可见。(4)持久性(Durability)一旦事务提
2021-05-10 23:09:41
151
原创 《2021春招复习11》计算机网络《计算机网络》
1、计算机网路的分层:不同的协议栈用于定义和管理不同网络的数据转发规则。分层模型- OSI国际标准化组织ISO于1984年提出了OSI RM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI 参考模型很快成为了计算机网络通信的基础模型。OSI参考模型具有以下优点:1、简化了相关的网络操作;2、提供了不同厂商之间的兼容性;3、促进了标准化工作;4、结构上进行了分层;5、易于学习和操作。OSI参考模型各个层次的基本功能如
2021-05-10 23:03:31
414
转载 《2021春招复习7》线程同步的几种方式《Java并发》
8、线程同步的几种方式☆ 同步是为了在多线程环境下,安全地访问临界区(共享区域),程序不会产生设计之外的错误结果(举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存100块。假设账户原有0块,如果取钱线程和存钱线程同时发生,会出现什么错误?)1、Synchronized☆ 同步方法:即有synchronized关键词修饰的方法。由于java的每个对象都有一个内置锁,当用此关键词修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 同步代
2021-05-09 21:46:47
244
原创 《2021春招复习6》基础概念《Java并发》
1、简述下Java的内存模型(Java Memory Model (JMM))全面理解Java内存模型 JVM中存在一个主内存(Main Memory或Java Heap Memory),Java中的所有变量都是存在主存中的,对所有线程共享。每个线程又存在自己的工作内存(本地内存/Working memory),其中主要保存主存中某些变量的copy,线程对所有变量的操作并非发生在主存区,而是发生在工作内存中,但线程之间不能直接访问,变量在程序中的传递主要依靠主存中来完成。引申:线程之间是如何通信的
2021-05-09 21:24:04
153
原创 《2021春招复习5》JVM《JVM》
1、介绍JVM的内存区域(运行时数据区)。☆ JVM中内存分为若干部分:堆、方法区、虚拟机栈、本地方法栈、程序计数器。其中堆和方法区是线程共享的部分,其他是线程隔离的。1、堆 Java堆是用来存放实例对象和数组对象的,由于存在逃逸分析技术(分析这个对象不会被其他方法或者线程调用),也可以分布在栈上,随着出栈而被销毁,同时,Java堆也是垃圾回收的主要区域,由于现在垃圾收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代。Java堆在物理上可以不连续,只要逻辑连续就好
2021-05-07 15:46:40
162
原创 《leetcode》剑指 Offer 09. 用两个栈实现队列《辅助栈》
剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:[“CQueue”,“delete
2021-05-05 12:30:16
151
转载 《leetcode》剑指 Offer 33. 二叉搜索树的后序遍历序列《单调栈》
剑指 Offer 33. 二叉搜索树的后序遍历序列难度中等253输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= ...
2021-05-04 22:52:30
190
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅