- 博客(82)
- 问答 (6)
- 收藏
- 关注
原创 GoF设计模式——外观模式
外观模式(Facade Pattern)通过提供统一入口,将多个复杂子系统封装在一起,对外暴露简单易用的接口。客户端无需了解内部实现细节,只需调用外观对象即可完成复杂操作,从而降低耦合度,提升系统的易用性和可维护性。
2026-06-04 21:57:30
201
原创 GoF设计模式——装饰模式
装饰模式:动态扩展功能的灵活之道 装饰模式通过组合替代继承,解决了类膨胀问题。它将核心功能与装饰功能分离,以嵌套包装的方式动态添加职责。该模式包含四个角色:组件接口、具体组件、抽象装饰器和具体装饰器。 关键优势在于: 运行时灵活扩展功能,避免继承导致的静态固化 符合开闭原则,新增装饰器不影响现有代码 通过多层嵌套实现功能叠加 典型应用场景包括: 需要动态添加/撤销功能的场合 不适合使用子类扩展的情况 如Java I/O流、GUI组件装饰等 与继承相比,装饰模式更灵活;与组合相比,它能保持接口一致性。但过度使
2026-06-02 23:07:35
277
原创 GoF设计模式——代理模式
有时候我们不能或不想直接访问某个对象。比如对象创建开销很大需要延迟加载,或者需要在访问前做权限检查,或者需要记录访问日志。直接在业务代码中掺杂这些逻辑会让代码臃肿且难以维护。代理模式通过引入一个中间层,将这些控制逻辑从业务代码中分离出来。客户端代码不需要知道它是在和代理交互还是真实对象交互,两者可以透明替换。代理模式本质上是一层"中间人"——为真实对象提供一个替身,在调用前后添加控制逻辑。什么时候用想控制对某个对象的访问(权限、延迟加载、缓存、日志)需要为远程对象提供本地代表。
2026-05-28 21:55:04
546
原创 GoF设计模式——适配器模式
适配器模式是一种结构型设计模式,用于解决接口不兼容问题。它通过适配器类将已有类的接口转换为客户端期望的接口,使原本不兼容的类能够协同工作。适配器模式包含目标接口、适配器和被适配者三个角色,有两种实现方式:对象适配器(推荐,通过组合实现)和类适配器(通过继承实现)。该模式适用于复用已有类、统一第三方库调用、新旧系统过渡等场景,但当接口差异过大时不宜使用。适配器模式如同电源转换头,在不修改原有代码的情况下实现接口转换。
2026-05-26 22:44:05
356
原创 微信人脸认证1.0迁移2.0
微信人脸核身2.0接口迁移指南 摘要:微信平台将于2026年6月30日停止原人脸核身接口服务,新版2.0接口包含四个关键API:获取凭证(getAccessToken)、获取会话ID(getVerifyId)、发起验证(wx.requestFacialVerify)和查询结果(queryVerifyInfo)。实现流程包括:后端获取凭证和会话ID并建立映射关系,前端发起验证后,后端查询最终结果。注意事项包括AppSecret安全保护和凭证缓存机制。迁移需按照官方时序图完成接口改造,确保业务平稳过渡。
2026-05-24 12:33:05
360
原创 GoF设计模式——原型模式
摘要: 原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,避免重复执行昂贵的初始化过程(如数据库查询、复杂计算等)。该模式包含三个核心角色:抽象原型(声明克隆方法)、具体原型(实现克隆逻辑)、原型注册表(管理常用原型)。拷贝方式分为浅拷贝(共享引用对象)和深拷贝(完全独立对象),需根据业务需求选择。实现方式包括GoF标准实现(clone()方法)、拷贝构造器(类型安全推荐方案)和Java的Cloneable接口(存在设计缺陷)。原型模式适用于创建成本高且对象相
2026-05-19 22:20:26
537
2
原创 GoF设计模式——建造者模式
建造者模式是一种创建型设计模式,用于分离复杂对象的构建过程和表示。它通过抽象建造者定义构建步骤,具体建造者实现不同产品变体,指导者封装构建顺序。该模式解决了构造函数参数爆炸、可选参数和构建逻辑分散的问题。标准实现包含产品、抽象建造者、具体建造者和指导者四个角色,适用于构建算法固定的场景。实际开发中常用简化版链式调用(Fluent Builder),省略指导者角色,通过Builder自身支持链式调用来简化构建过程。建造者模式的核心价值在于将构建过程与表示分离,使同一构建算法可以创建不同产品。
2026-05-14 21:57:41
467
原创 GoF设计模式——抽象工厂模式
本文介绍了抽象工厂模式,该模式用于创建一系列相关或相互依赖的对象,确保产品风格统一。与工厂方法模式不同,抽象工厂关注的是产品族的创建,而非单一产品。文章通过家具工厂的示例说明:古典工厂生产配套的古典沙发和椅子,现代工厂生产配套的现代家具,避免风格混搭。模式包含抽象工厂接口、具体工厂类、抽象产品接口和具体产品类四个角色,其中每个具体工厂负责一个完整产品族的创建。代码示例展示了如何实现抽象工厂模式,通过接口约束确保同一工厂创建的产品属于同一风格,解决了产品配套使用的问题。该模式适用于需要保证多产品协同工作的场景
2026-05-12 09:09:35
409
原创 GoF设计模式——工厂方法模式
本文对比了简单工厂模式和工厂方法模式。简单工厂通过集中式的if-else逻辑创建产品,适用于产品类型少且稳定的场景,但当产品增多时会导致工厂类膨胀。工厂方法模式将创建职责分散到具体工厂类中,每个工厂只负责一种产品,符合开闭原则,便于扩展。实现上,简单工厂使用单一工厂类管理所有产品创建,而工厂方法模式定义抽象工厂接口,由具体工厂实现创建逻辑。两种模式的选择取决于产品变化的频率和复杂度。
2026-05-07 22:15:58
455
原创 GoF设计模式——单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。适用于需要共享资源或保持数据一致的场景。常见实现方式包括: 饿汉式:类加载时创建实例,简单但可能浪费资源 懒汉式:首次请求时创建,需处理多线程安全问题 双重检查锁:线程安全且性能较好 静态内部类:结合懒加载和线程安全 枚举:最安全,天然防反射和序列化 单例模式优点包括节省资源、保持数据一致和全局访问方便,但存在测试困难和隐藏依赖等问题。日常开发推荐使用静态内部类实现,需要序列化时选择枚举方式。示例展示了银行叫号系统中单例模式的应用,确保
2026-05-04 23:56:35
455
原创 C语言——printf()计算参数顺序
`printf()`函数中的表达式参数的计算顺序是从右往左的,当所有表达式计算完后,将最后的值赋给`printf()`函数所有引用当前变量的位置,除了进行了后置自增/自减操作的位置。
2023-02-27 21:29:58
8154
2
原创 C语言——简易扫雷
最终效果:目录1、总体逻辑2、地图布局3、埋雷4、打印地图5、扫雷5.1、将每个雷的位置显示到当前地图上5.2、计算出当前地图剩余的非雷数5.3、计算坐标周围雷的个数5.4、如果周围没有雷显示空白并且向外扩展6、总体1、总体逻辑扫雷的地图以9x9的大小为例,需要一个二维数组来当地图,并且要在这个地图上进行埋雷、扫雷操作,还要将周围的雷数显示出来,所以仅用一个二维数组是不够的,需要用两个:埋雷地图:雷层,埋在土的下面 扫雷地图:土层,铺在雷的上..
2022-02-18 16:09:27
3837
4
原创 C语言——简单三子棋
最终效果图:目录1、总体逻辑2、打印棋盘3、玩家下棋4、电脑下棋5、判断输赢6、总体1、总体逻辑棋盘为3x3的大小,玩家下棋通过键盘输入完成,电脑下棋通过生成随机数完成,在每一次下棋后,都要判断棋盘上的胜负情况:玩家连成三子:玩家胜; 电脑连成三子:电脑胜; 都没连成三子: 棋盘满了:平局 棋盘没满:继续 2、打印棋盘棋盘是3x3规格的,所以用一个3x3的二维数组来表示棋盘,并且需要初始化棋盘,此时棋盘上没有任何标记://棋盘长宽#de.
2022-02-18 14:57:43
4003
原创 Vmware安装Ubuntu16.4、Ubuntu里安装python3.9、Ubuntu安装PyCharm的过程及出现的问题的解决
目录1、VMware安装Ubuntu16.4虚拟机1.1、下载Ubuntu镜像文件1.2、安装Ubuntu虚拟机1.2、装Ubuntu系统 和 虚拟机工具1.3、解决Ubuntu不能全屏显示1.4、设置共享文件夹1.4.1、主机上的文件夹设置1.4.2、虚拟机上的设置1.5、解决/mnt下没有hgfs文件夹1.6、解决找不到共享文件夹的问题1.7、 解决重启后共享文件夹没有了的问题2、Ubuntu安装Python3.92.1、安装Python3.92.
2022-01-31 00:31:31
5251
10
原创 栈——匹配括号
用栈来判断输入的括号是否合法。()、[]、{}、{[()]}、{()[]{}}这些都是合法的;([)]、(]}这些都是不合法的。用一个栈,输入一行括号序列,挨个读取,当读到左括号时('('、'['、‘{’)就把他入栈,然后继续读取;当读到右括号时(')'、']'、‘}’)就出栈,判断出栈的括号是否与当前的右括号匹配。代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string,h.
2022-01-06 11:31:19
554
原创 数组模拟单链表
链表中每个结点只有两个部分:值域和指针域;值域存放的是自身的值,指针域放的就是下一个结点的地址,如果指针域用数组表示的话,也就是下一个结点的值的下标。所以用两个数组来模拟单链表,一个data数组表示值域(存的是结点的值),一个next数组表示指针域(存的是下一个结点在data数组里的下标)。如图:next数组的下标是当前结点的下标,next的元素对应着是当前结点的下一个结点的下标。比如:next[0]表示data[0]的下一个结点的下标是1,即a的下一个结点b在data数组里.
2022-01-06 11:18:59
541
2
原创 纸牌游戏——小猫钓鱼(队列、栈)
游戏规则:将一副扑克牌分成两份,每人拿一份,A先拿出一张牌放在桌上,然后B在拿出一张牌放在桌上并放在A的那张牌上面,就这样二人交替出牌。出牌时,如果某人打出的牌与桌上某张牌牌面相同,即可获得两张相同的牌及其中间所夹的牌,并依次放到自己手中的牌的末尾,当任意一人手牌全部出完时,游戏结束,对手胜。思路:首先A和B只有两个操作,出牌和赢牌,而出牌和赢牌操作就如同队列,一头出一头进,先进先出,所以定义一个队列的结构体来代表两人的手牌。//队列typedef struct queue { int.
2022-01-06 10:05:30
4937
原创 C语言——数字金字塔
金字塔一共有N层,每Ni层都有Ni个房间,每个房间都有数量不同的金钱,需要从金字塔顶端向下走,收集到最多的金钱,但是不能在一层中横向移动,只能向下一层的相对现在房间的右一个或下一个。输入:第一行输入一个整数N(1<=N<=100)后面N行输入每Ni行输入i个整数Nij(1<=Nij<=10000)输出输出最多的金钱例输入: 输出:29511 25 4 36 7 8 ...
2022-01-03 10:56:29
4050
3
原创 数据结构哈希表的基本操作(C语言)
设有一组关键字(19,14,23,1,68,20,84,27,56,11,10,79),建立一个哈希查找表。(1)哈希函数采用: H(key)= key % P(其中P=13),若发生冲突后,用链地址法解决冲突。(2)哈希函数采用: H(key)= key % P(其中P=13),若发生冲突后, 用线性探测再散列方法解决冲突。编写程序建立哈希查找表,运行程序在表中查找68,99。目录1、哈希表结点结构与哈希函数2、链地址法2.1、初始化2.2、插入2.3、查找3、线性..
2021-12-09 10:52:07
5365
5
原创 数据结构二叉排序树的 基本操作(C语言)
随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树,然后删除某一指定关键字元素。目录1、二叉排序树的结构2、插入结点3、查找结点4、创建二叉树5、删除结点6、完整测试源码1、二叉排序树的结构就是一般二叉树的结构。//二叉排序树typedef struct BST { int data; //值域 struct BST* left; //左孩子 struct BST* right; //右孩子}*BST;2、.
2021-12-09 10:21:06
6876
3
原创 数据结构无向图的操作(C语言)
目录//1、含邻接矩阵的图结构//2、创建邻接矩阵//3、打印邻接矩阵//4、邻接表的图结构//5、创建邻接表//6、打印邻接表//7、深度优先搜索//8、广度优先搜索//9、带主函数完整测试源码//1、含邻接矩阵的图结构用邻接矩阵来表示图://定义邻接矩阵的图结构typedef struct graph { elemtype data[N + 1];//存放顶点,不使用data[0]存放 int side[N + 1][N + 1];//邻接矩阵,同
2021-12-02 23:43:11
4825
原创 数据结构哈夫曼树的基本操作(C语言)
目录//1、树的结构定义//2、创建哈夫曼树//2、 根到叶子的路径//3、哈夫曼编码//1、树的结构定义#define n 4 //叶子结点个数#define m 2*n-1 //树的个数typedef struct HFTree { int weight; //权值 int parent; //双亲 int left; //左儿子 int right; //右儿子}*HF;HF hftree[m+1]; //下标从1开始计数,树的结点都是存在这个数组里的,通.
2021-11-10 21:43:12
2775
原创 NC128 接雨水问题
描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)示例1输入:[3,1,2,5,2,4]返回值:5说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 ,如题面图。示例2输入:[4,5,1,3,2]返回值:2思路1:首先只有一根柱子或者...
2021-11-09 11:39:47
352
原创 NC13 二叉树的最大深度
描述求给定二叉树的最大深度,深度是指树的根节点到任一叶子节点路径上节点的数量。最大深度是所有叶子节点的深度的最大值。数据范围:0 \le n \le 1000000≤n≤100000,树上每个节点的val满足|val| \le 100∣val∣≤100.示例1:输入:{1,2}返回值:2示例2:输入:{1,2,3,4,#,#,5}返回值:3思路:用递归/** * struct TreeNode { * int val; * struct TreeNo..
2021-11-07 22:45:10
336
原创 数据结构二叉树的常规算法(C语言)
求二叉树叶子结点个数。 求二叉树的宽度。 求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。 输出二叉树中从每个叶子结点到根结点的路径。目录//树的结构定义//求叶子结点个数//求树的宽度//求树的深度//求最长路径//求叶子节点到根节点的路径//树的结构定义//二叉树:typedef struct BTree { elemtype data; struct BTree* left; struct BTree* right;}*BT..
2021-11-07 20:02:51
2467
1
原创 数据结构线索二叉树的操作(C语言)
线索二叉树简单来说就是利用原来的指针域通过标记区分将每个节点的直接前驱和后继结点记录下来,这个记录下前后结点的过程就叫线索化,线索化后的二叉树就是线索二叉树。主要写了前序、中序、后序三种方法的线索化,前序和中序的两种遍历方式。目录//树结构定义及主函数//用队列初始化树//前序线索化//中序线索化//后序线索化//前序遍历线索二叉树//中序遍历线索二叉树//树结构定义及主函数typedef char ElemType; //定义元素类型#define.
2021-11-01 16:43:15
679
原创 C语言——常用字符串函数的总结与模拟实现
C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。字符串常量 适用于那些对它不做修改的字符串函数。一、strlen函数1、函数介绍: 用途:求字符串的长度 格式:size_t strlen(const char* str); ( size_t代表无符号整形:size_t==unsigned int) 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中的'\0'前面出现的字符个数(不包含‘\0’); 参数指向的字符串必...
2021-10-24 08:00:00
770
2
原创 C语言——str1的字母能否拼出str2
题目描述:给一些字母(str1),判断是否能用这些字母拼出给定的单词(str2)。示例1:输入:str1=ardhpyp,str2=happy输出:yes示例2:输入:str1=ardhypy,str2=happy输出:no思路:可以用数组把两个字符串存起来,然后用str2的每个字符和str1的每个字符比较,用一个count来计相等字符的个数,当count等于了str2的长度,说明str1的字母可以拼出str2。代码及详情如下:int main() {..
2021-10-23 23:28:01
378
1
原创 SQLZOO做题笔记
2、replace语法:replace ( string_expression , string_pattern , string_replacement ) string_expression 要搜索的字符串表达式。string_expression 可以是字符或二进制数据类型。 string_pattern 是要查找的子字符串。string_pattern 可以是字符或二进制数据类型。string_pattern 不能是空字符串 (''")。 string_replacement 替换字符.
2021-10-11 17:01:11
738
原创 NC72 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。源二叉树镜像后二叉树示例1输入:{8,6,10,5,7,9,11}返回值:{8,10,6,11,9,7,5}说明:如题面所示示例2输入:{}返回值:{}思路:需要交换每一个结点的左右儿子,如果结点为空就返回,如果是叶子结点也返回;可以用递归来遍历每一个结点,然后将其左右儿子交换。代码及详情如下:/** * struct TreeNode { * int val; * struct Tree...
2021-10-09 21:30:34
224
原创 NC117 合并二叉树
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:两颗二叉树是:合并后的树为示例1输入:{1,3,2,5},{2,1,3,#,4,#,7}返回值:{3,4,5,5,4,#,7}示例2输入:{1},{}返回值:{1}思路:需要遍历比较两棵树的结点,如果两个相同位置的结点都不为空,那么就将值相加;如果相同位置有一个结点为空,那么就返回另一个不为空的结点。代码及详情...
2021-10-08 22:47:36
201
原创 数据结构二叉树的基本操作(C语言)
要求数据域为字符的一棵二叉树用广义表形式输入,创建一个采用二叉链表存储的二叉树,并按广义表的形式输出这棵二叉树。 完成这棵二叉树的中序遍历的递归算法。 完成这棵二叉树的中序遍历的非递归算法。主要是写广义表形式的输入输出和递归于非递归的中序遍历。但我多写了其他操作,因为操作不熟,导致bug横生,日后再改,单个功能函数可供参考。目录//头文件//主函数顺序存储//主函数//初始化//打印//插入//删除//关系//修改//遍历链式存储...
2021-10-03 08:13:41
3164
2
原创 C语言——母牛的故事
思路:递归年数 n:1 2 3 4 5 6 7 8 牛数 f(n):1 2 3 4 6 9 13 19找规律:f(n)=f(n-1)+f(n-3)(n>3);代码如下:# include<stdio.h> int fun(int n){ if...
2021-10-01 23:32:56
1097
原创 NC55 最长公共前缀
描述给你一个大小为 n的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。示例1输入:["abca","abc","abca","abc","abcc"]返回值:"abc"示例2输入:["abc"]返回值:“abc"思路:求最长的公共部分,那么就从每一个字符串的第一个字符开始比较。将这个一维字符串数组想象成一列,依次比较每一个字符串的每一个字符,直到有不相同的字符出现或者到有一个字符串比较完了的情况出现就返回..
2021-10-01 17:12:20
347
原创 NC32 求平方根
描述实现函数int sqrt(int x).计算并返回 x 的平方根(向下取整)示例1输入:2返回值:1示例2输入:2143195649返回值:46294思路1:利用平方数的性质:连续n个计数相加的结果就是一个平方数:如:16=1+3+5+7,n=4,16=4*4。9=1+3+5,n=3,9=3*3;4=1+3,n=2,4=2*2。所以,用x连续减去这些奇数,减的次数就是这些奇数的个数,也就是...
2021-09-30 09:02:11
397
原创 NC33 合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。输入描述:给定两个单调递增的链表返回值描述:输出两个链表合成后仍满足非递减的性质的链表示例:输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}思路1:非递归方法用指针来比较结点值的大小,比较一个就插入一个数据结构单链表的基础操作(C语言)代码如下:/** * struct ListNode { * int val; * st.
2021-09-29 08:01:44
282
原创 NC61 两数之和
题目描述:给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。例如:给出的数组为 [20, 70, 110, 150] , 目标值为90返回一个数组 [1,2] ,因为示例1输入:[3,2,4],6 返回值:[2,3]说明:因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以输出[2,3]示例2...
2021-09-27 23:34:20
433
原创 NC76 用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成 n 次在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。数据范围: n<=1000要求:空间复杂度,时间复杂度O(1)示例:输入:["PSH1","PSH2","POP","POP"] 返回值:1,2说明:"PSH1":代表将1插入队列尾部 "PSH2":代表将2插入队列尾部 "POP“:代表删除一...
2021-09-27 08:43:51
203
原创 NC156 数组中只出现一次的数(其它数出现k次)
题目描述:给定一个长度为的整型数组arr和一个整数k(k>1)。已知中只有 1 个数出现一次,其他的数都出现k次。请返回只出现了 1 次的数。输入:[5,4,1,1,5,1,5],3返回值:4目录思路1:(暴力求解)思路2:(位运算)思路3:(排序法)思路4:(异或方法)思路1:(暴力求解)以每一个数去遍历整个数组,碰到相同的数就记下来,遍历完后,判断记下的数等不等于k,等于就判断下一个数,不等于就直接...
2021-09-26 10:14:52
729
1
空空如也
微信小程序如何接入教务系统
2022-01-21
windows10家庭版升级专业版
2021-09-06
数据结构单链表小问题
2021-09-06
c语言结构体格式问题
2021-09-06
Java的缓冲区怎么清除?
2021-08-29
c语言结构体一个错误
2021-09-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅