Leecode 0131. Palindrome Partitioning
131. Palindrome PartitioningGiven a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. Example 1: 12Input: s = "aab"Output: [["a","a","b"],["aa","b"]] Example 2: 12Input: s = "a"Output: [["a"]] 题目大意给定一个字符串 s,将其分割成若干个子串,使得每个子串都是回文串。返回所有可能的分割方案。 例如: 输入 s = "aab",输出...
责任链模式
一、责任链模式原理说明1.1 模式定义根据《大话设计模式》定义,责任链模式(Chain of Responsibility Pattern) 是一种对象行为型模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 1.2 模式结构责任链模式包含以下核心角色,各角色职责明确且协同工作: 角色名称 核心职责 典型实现方式 抽象处理者(Handler) 定义处理请求的接口,包含抽象处理方法和一个后继连接 抽象类或纯虚函数接口 具体处理者(ConcreteHandler) 实现抽象处理者的接口,判断能否处理当前请求;若能则处理,否则将请求转发给后继者 继承抽象处理者的具体类 客户端(Client) 创建处理链,并向链头的具体处理者提交请求,不关心请求的处理细节和传递过程 主函数或业务逻辑模块 1.3...
观察者模式
一、模式核心原理1.1 模式定义观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象间一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会自动收到通知并更新。 该模式的核心价值在于解耦被观察者与观察者: 被观察者无需知道具体观察者的类型和实现 观察者可独立添加 / 移除,不影响被观察者核心逻辑 支持事件驱动架构的灵活扩展 1.2 UML 类图结构观察者模式包含四个核心角色: 角色 职责 典型实现 Subject(抽象被观察者) 定义观察者管理接口(注册 / 移除 / 通知) 抽象基类 ConcreteSubject(具体被观察者) 维护状态,状态变化时通知所有观察者 继承 Subject 的具体类 Observer(抽象观察者) 定义更新接口,供被观察者通知时调用 抽象基类 ConcreteObserver(具体观察者) 实现更新接口,处理被观察者的通知 继承 Observer...
抽象工厂模式
一、工厂方法模式的局限性工厂方法模式仅能创建单一产品等级结构的对象,当系统需要创建多个相互关联的产品族时,工厂方法模式便显现出明显不足。例如,在开发跨平台 UI 组件时,需要同时创建 Windows 风格的按钮和文本框,以及 macOS 风格的按钮和文本框,这些按钮和文本框分别构成不同的产品族。若使用工厂方法模式,需为每个产品(按钮、文本框)都创建对应的工厂类,会导致类的数量急剧增加,且难以保证同一产品族内产品的一致性。而抽象工厂模式恰好能解决这一问题,它可提供一个接口,用于创建一系列相关或相互依赖的对象,无需指定它们的具体类。 二、抽象工厂模式结构2.1 结构文字描述抽象工厂模式包含四个核心角色: 抽象工厂(Abstract Factory):声明一组用于创建一族产品的方法,每个方法对应一种产品。 具体工厂(Concrete Factory):实现抽象工厂中声明的创建产品的方法,生成具体的产品对象,一个具体工厂对应一个产品族。 抽象产品(Abstract Product):为每种产品声明接口,定义产品的公共方法。 具体产品(Concrete...
Leecode 0040. Combination Sum II
40. Combination Sum IIGiven a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target. Each number in candidates may only be used once in the combination. Note: The solution set must not contain duplicate combinations. Example 1: 12345678Input: candidates = [10,1,2,7,6,1,5], target = 8Output: [[1,1,6],[1,2,5],[1,7],[2,6]] Example 2: 123456Input: candidates = [2,5,2,1,2], target =...
Leecode 0039. Combination Sum
39. Combination SumGiven an array of distinct integers candidates and a target integer target, return a list of all unique combinations of candidates where the chosen numbers sum to target. You may return the combinations in any order. The same number may be chosen from candidates an unlimited number of times. Two combinations are unique if the frequency of at least one of the chosen numbers is different. The test cases are generated such that the number of unique combinations that sum up to...
Leecode 0216. Combination Sum III
216. Combination Sum IIIFind all valid combinations of k numbers that sum up to n such that the following conditions are true: Only numbers 1 through 9 are used. Each number is used at most once. Return a list of all possible valid combinations. The list must not contain the same combination twice, and the combinations may be returned in any order. Example 1: 12345Input: k = 3, n = 7Output: [[1,2,4]]Explanation:1 + 2 + 4 = 7There are no other valid combinations. Example 2: 1234567Input: k...
C++ 类间关系与功能复用
导言在面向对象编程的世界里,类与类之间的关系设计和功能复用机制是构建高质量软件的基石。理解这些概念不仅有助于写出结构清晰的代码,更能提升系统的可维护性和扩展性。本文将结合实例,深入探讨 C++ 中类间的五大关系(继承、组合、聚合、关联、依赖),并分享对功能复用的理解与实践经验。 一、对类间关系的本质理解类间关系本质上反映了现实世界中事物之间的联系,是对客观世界的抽象。在面向对象设计中,我们通过类间关系来建模这些联系,使软件系统更贴近现实逻辑。 类间关系并非孤立存在,它们之间存在着从强耦合到弱耦合的渐变过程:继承 > 组合 > 聚合 > 关联 > 依赖。这种耦合度的差异,决定了它们在不同场景下的适用性。 让我们以基础类 A 为核心,通过具体代码来理解这些关系: 123456789class A{public: friend class E; void func() { cout << "hello,world" << endl; ...
策略模式的实践与解析
一、核心概念1.1 定义策略模式(Strategy Pattern)核心思想是将算法家族封装起来,使它们之间可以相互替换,且算法的变化不会影响使用算法的客户端。该模式通过面向对象的多态机制,实现了算法与使用环境的解耦,让代码结构更清晰、可维护性更强。 1.2 核心解决的问题在传统开发中,若一个功能存在多种实现算法(如排序算法、支付方式、日志记录方式),通常会使用if-else或switch语句进行分支判断,选择不同的算法实现。这种方式存在以下问题: 代码耦合度高:算法逻辑与调用逻辑混杂在同一代码块中 扩展性差:新增算法需修改原有判断逻辑,违反开闭原则 维护成本高:算法逻辑分散,后续修改易引发连锁反应 可读性差:大量分支判断导致代码逻辑复杂,难以理解 策略模式通过将不同算法封装为独立的策略类,彻底解决了上述问题,使代码结构更符合面向对象设计原则。 二、结构组成策略模式包含三个核心角色,各角色职责明确,协同工作实现算法的灵活切换: 2.1...
C++ 装饰模式
一、模式定义与核心思想装饰模式(Decorator Pattern)是结构型设计模式的重要成员,核心思想是:通过组合而非继承的方式,动态为对象添加额外职责。它避免了继承体系的臃肿,允许灵活组合多个功能,实现 “即插即用” 的扩展效果。 关键特征: 装饰器与被装饰对象遵循同一接口(或继承同一基类) 装饰器持有被装饰对象的引用,实现功能叠加 支持多层装饰,形成职责链 二、UML 类图结构1234567891011121314151617181920+----------------+| 抽象组件(Component) |+----------------+| + operation() |+----------------+ ↑ |+----------------+ +----------------+| 具体组件(Concrete) | | 装饰器基类(Decorator) |+----------------+ +----------------+| + operation() | |...
C++ 工厂方法模式
一、模式简介工厂方法模式(Factory Method Pattern)是创建型设计模式的核心成员,其核心思想是:定义一个创建对象的接口(抽象工厂),但由子类(具体工厂)决定实例化哪个类(具体产品)。通过这种设计,将对象的创建逻辑与使用逻辑彻底分离,让代码更具扩展性和可维护性。 二、核心概念与结构工厂方法模式包含 4 个关键角色,形成清晰的继承体系: 抽象产品(Abstract Product) 定义产品的通用接口,所有具体产品都需实现该接口。例如 “交通工具” 抽象类,包含 “行驶” 纯虚函数。 具体产品(Concrete Product) 抽象产品的实现类,是工厂方法最终创建的对象。例如 “汽车”“自行车” 类,分别实现 “行驶” 方法。 抽象工厂(Abstract Factory) 定义创建产品的接口(工厂方法),返回抽象产品类型。例如 “交通工具工厂” 抽象类,包含 “创建交通工具” 纯虚函数。 具体工厂(Concrete Factory) 抽象工厂的实现类,重写工厂方法,返回具体产品实例。例如 “汽车工厂” 创建汽车对象,“自行车工厂”...
C++ 实现简单工厂模式
一、简单工厂简单工厂模式的核心是通过一个工厂类统一创建不同产品实例,本质是将对象创建逻辑与使用逻辑分离。C++ 作为面向对象编程语言,天然支持类与继承、多态、虚函数等特性,相比 C 语言的模拟实现,能更直接、优雅地满足简单工厂模式的设计意图,且无需手动管理函数指针与内存分配的绑定关系。 从两个维度理解适配性: 语法维度:通过抽象基类定义产品接口,具体产品类继承基类并实现纯虚函数,工厂类通过静态成员函数创建产品实例,完全符合面向对象的设计规范 功能维度:利用 C++ 的多态特性,调用者可通过基类指针 / 引用统一操作不同产品,无需关注具体产品类型;通过构造函数与析构函数自动管理内存,避免内存泄漏风险 二、核心结构2.1...
规范化 Git 提交 -- commitlint + husky
导言在团队开发或开源项目协作中,Git 提交信息如同代码的 “说明书”,直接影响代码可维护性与问题追溯效率。然而实际开发中,提交信息往往存在格式混乱、描述模糊等问题,例如 “fix bug”“update code” 这类无意义的表述。本文将通过 commitlint(提交信息验证工具)与 husky(Git 钩子管理工具)的组合,带你实现提交信息规范化与自动化校验,彻底解决这一痛点。 一、提交信息的常见问题与规范需求1.1 典型问题分析在未实施规范的项目中,提交信息通常存在以下问题: 格式混乱:无固定结构,有的包含类型,有的仅描述内容 描述模糊:如 “修改样式”“优化代码”,无法快速理解变更目的 信息不全:未关联需求编号或 Bug ID,问题追溯困难 语义缺失:无法通过提交信息判断变更类型(如功能新增、Bug 修复、文档更新) 1.2 规范标准选择:Conventional Commits目前行业广泛采用的 Conventional Commits(约定式提交) 标准,定义了结构化的提交信息格式: 12345<type>[optional...
团队 Git 协作规范整理
一、分支管理:搭建 “分工明确” 的协作骨架混乱的分支体系是团队 Git 协作的万恶之源。想象一下:有人在main分支直接写代码,有人用 “test1”“newcode” 命名分支,合并时根本分不清分支用途 —— 这种场景下,冲突和版本混乱只是时间问题。 1. 推荐:简化版 Git Flow 分支结构企业级项目中,无需过度复杂的分支模型,一套 “主分支 + 辅助分支” 的简化结构足以满足需求,核心是明确每个分支的 “生命周期” 和 “职责边界”: 分支类型 命名规范 核心用途 操作红线 主分支 main/trunk 存放生产环境代码,始终保持 “可部署” 状态(任何时候拉取都能正常运行) 严禁直接push,仅通过 PR 合并,合并前必须经过测试 开发分支 develop 团队日常开发集成分支,汇总各功能分支代码,是预发布前的 “代码蓄水池” 不直接在该分支写代码,仅接受功能分支合并 功能分支 feature/模块名-需求描述 单个功能 /...
Leecode 0077. Combinations
77. CombinationsGiven two integers n and k, return all possible combinations of k numbers chosen from the range [1, n]. You may return the answer in any order. Example 1: 1234Input: n = 4, k = 2Output: [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]Explanation: There are 4 choose 2 = 6 total combinations.Note that combinations are unordered, i.e., [1,2] and [2,1] are considered to be the same combination. Example 2: 123Input: n = 1, k = 1Output: [[1]]Explanation: There is 1 choose 1 = 1 total...
Leecode 0108. Convert Sorted Array to Binary Search Tree
108. Convert Sorted Array to Binary Search TreeGiven an integer array nums where the elements are sorted in ascending order, convert it to a *height-balanced* binary search tree. Example 1: 123Input: nums = [-10,-3,0,5,9]Output: [0,-3,9,-10,null,5]Explanation: [0,-10,5,null,-3,null,9] is also accepted: Example 2: 123Input: nums = [1,3]Output: [3,1]Explanation: [1,null,3] and [3,1] are both height-balanced BSTs. 题目大意给定一个升序排列的整数数组 nums,将其转换为一棵高度平衡的二叉搜索树(BST)。高度平衡的定义是:二叉树的左右两个子树的高度差的绝对值不超过...
Leecode 0106. Construct Binary Tree from Inorder and Postorder Traversal
106. Construct Binary Tree from Inorder and Postorder TraversalGiven two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the same tree, construct and return the binary tree. Example 1: 12Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]Output: [3,9,20,null,null,15,7] Example 2: 12Input: inorder = [-1], postorder = [-1]Output: [-1] 题目大意给定一棵二叉树的中序遍历数组 inorder 和后序遍历数组...
类图设计--编程的前置准备
一、类图设计方法论:构建稳健的面向对象模型类图建模的本质是将现实世界的业务概念转化为计算机可理解的面向对象结构。遵循科学的方法论是确保模型质量的基础,核心包含四大环节:元素识别、关系构建、属性定义与模型优化。 1.1 元素识别:精准定位核心建模单元元素识别是类图设计的起点,需从业务需求中提取关键概念并转化为 UML 元素。识别过程需遵循 "单一职责原则",确保每个元素职责清晰、边界明确。 核心元素类型及识别方法 元素类型 识别特征 表示符号 应用场景 类 (Class) 具有相同属性和行为的对象集合 矩形(分三层:类名 / 属性 / 方法) 业务实体(如 User、Order)、控制逻辑(如 OrderService)、工具组件(如 DateUtils) 接口 (Interface) 定义行为契约,无具体实现 棒棒糖形状或矩形(标注 <>) 服务契约(如 PaymentGateway)、模块边界(如 UserRepository) 抽象类 (Abstract...
基于图形面积计算项目的 OOA/OOD/OOP 全流程解析与类图设计
一、面向对象分析(OOA):需求提取与实体识别1.1 核心业务需求本系统旨在实现以下关键功能: 支持对多种基础几何图形,包括矩形、圆形和三角形的面积计算; 以统一的方式展示不同类型图形的名称及其对应的面积计算结果; 构建具有高度扩展性的系统架构,确保在新增图形类型时,现有计算逻辑无需进行任何修改。 1.2 核心实体识别(3 个以上核心实体)经过严谨的需求分析,本研究确定了以下核心业务实体,并对各实体的属性、行为及业务约束进行了详细定义: 实体名称 核心属性 核心行为 业务约束 图形(Figure) 无直接属性(抽象概念) 获取名称、计算面积 作为抽象基类,不可实例化,需由具体图形类继承 矩形(Rectangle) 长度(length)、宽度(width) 计算面积、返回名称 长度和宽度必须为正数 圆形(Circle) 半径(radius) 计算面积、返回名称 半径必须为正数 三角形(Triangle) 三边长度(a、b、c) 计算面积、返回名称 三边长度需满足三角不等式(a+b>c...
内存池的初步实现
导言在 C++ 开发中,频繁使用 new/delete 会导致内存碎片、系统调用开销大等问题,尤其在多线程场景下性能损耗显著。内存池作为一种高效的内存管理方案,通过预先申请大块内存、重复利用空闲内存的方式,能有效解决这些问题。 一、内存池核心设计思路1.1 解决的核心问题 内存碎片:原生 new/delete 分配的内存大小随机,长期使用会产生大量无法利用的小块内存(碎片); 系统调用开销:每次 new 都会触发系统调用(如 brk/mmap),频繁调用会严重影响性能; 多线程安全:原生内存分配器的锁竞争会导致多线程场景下性能下降。 1.2 核心设计方案我们的内存池采用 “多池分治 + 无锁空闲链表 + 内存块复用” 的设计,具体如下: 多池分治:按内存大小划分 64 个内存池,分别管理 8~512 字节的内存(步长 8 字节),超过 512 字节的内存直接使用原生 new/delete; 无锁空闲链表:用原子操作(CAS)实现空闲内存的入队 / 出队,避免多线程锁竞争; 内存块复用:预先申请 4096...