Leetcode 0030.Substring with Concatenation of All Words(C++)
30. Substring with Concatenation of All Words题目You are given a string s and an array of strings words of the same length. Return all starting indices of substring(s) in s that is a concatenation of each word in words exactly once, in any order, and without any intervening characters. You can return the answer in any order. Example 1: 1234Input: s = "barfoothefoobarman", words = ["foo","bar"]Output: [0,9]Explanation: Substrings starting at index 0 and 9 are "...
C++ Vector
一、vector 容器概述vector 是 C++ 标准模板库(STL)中 最用的序列容器之一,它基于动态数组实现,能够存储同类型元素并支持高效的随机访问。自 C++98 标准首次引入以来,vector 凭借其灵活的内存管理和优秀的性能表现,成为了 C++ 开发者处理动态数据集合的首选工具。 与静态数组相比,vector 的核心优势在于自动内存管理—— 它会根据元素数量动态调整内部存储空间,无需开发者手动分配和释放内存。这种特性使得 vector 在处理元素数量不确定的场景时尤为便捷,同时保持了数组的随机访问效率。 vector 的核心特性可以概括为: 连续的内存空间分配,支持随机访问 动态扩容机制,自动管理内存 尾部插入 / 删除操作效率高 中间插入 / 删除操作可能导致大量元素移动 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include &...
Leetcode 0029.Divide Two Integers(python)
29. Divide Two Integers你选用何种方法解题?本题的核心是不使用乘法、除法和取模运算实现整数除法。 方法 时间复杂度 空间复杂度 是否推荐 位运算(位移法) O(log n) O(1) 推荐 负数倍增法 O(log n) O(1) 推荐 方法选择理由: 位运算(位移法):通过左移实现快速乘法,时间效率高 负数倍增法:使用负数处理避免溢出问题,更安全 解题过程问题分析输入:被除数 dividend,除数 divisor输出:两数相除的商(截断小数部分) 关键约束: 不能使用乘法、除法、取模运算 需要处理溢出情况 核心洞察 位运算替代乘法:x << k 等价于 x * 2^k 二分查找思想:找到最大的 k 使得 divisor * 2^k <= dividend 符号处理:先记录符号,将问题转化为正数或负数除法 负数处理:使用负数避免 abs(INT_MIN) 溢出 算法流程(负数倍增法)以 dividend = 15, divisor = 3 为例: 12345678910111213141516符号:正转化为负...
Leetcode 0029.Divide Two Integers(C++)
29. Divide Two Integers题目Given two integers dividend and divisor, divide two integers without using multiplication, division, and mod operator. The integer division should truncate toward zero, which means losing its fractional part. For example, 8.345 would be truncated to 8, and -2.7335 would be truncated to -2. Return the quotient after dividing dividend by divisor. Note: Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [−2^31...
Python @property装饰器核心机制解析
引言"明明定义了@property,为什么在init里给它赋值却提示can't set attribute?"——这是无数Python初学者踩过的坑。今天,我们从这个报错出发,彻底搞懂@property的底层逻辑。 一、错误现场:一个"只读"的陷阱先看这段看似合理的代码: 1234567class Student: def __init__(self, name): self.name = name # 这里会报错! @property def name(self): return self._name 运行后抛出AttributeError: can't set attribute。为什么?因为Python将@property装饰的name视为"只读属性"——你只定义了"读取方法"(getter),却没提供"写入方法"(setter),就像给变量装了个"只读开关",自然无法赋值。 二、核心机制:...
C++ 智能指针
一、引言引入智能指针(Smart Pointer)是 C++ 为解决动态内存管理问题而设计的工具,其核心目的是自动管理动态分配的内存(堆内存),避免手动管理内存时常见的错误(如内存泄漏、野指针、二次释放等),提高代码的安全性和健壮性。 二、智能指针基础2.1 具体解决的问题手动使用new分配内存和delete释放内存时,容易出现以下问题,而智能指针通过自动化机制解决了这些问题: 内存泄漏 手动管理时,若忘记调用delete释放已分配的内存,或因异常、分支跳转等导致delete未执行,会造成内存泄漏(内存被占用且无法回收)。 智能指针通过RAII(资源获取即初始化) 机制,在其生命周期结束(如离开作用域)时自动调用析构函数释放所管理的内存,无需手动操作。 野指针 若对已释放的内存再次访问(即野指针),会导致未定义行为(如程序崩溃、数据损坏)。 智能指针在内存释放后,会自动将内部指针置空(或标记为无效),避免野指针访问。 二次释放 若对同一块内存多次调用delete,会导致二次释放,引发程序崩溃。 智能指针通过内部引用计数或所有权管理,确保内存仅被释放一次。 ...
C++ 循环引用
一、智能指针循环引用问题的处理1.1 循环引用的产生与危害循环引用是shared_ptr使用过程中最常见的问题之一,当两个或多个shared_ptr形成引用闭环时就会产生循环引用。这种情况下,每个shared_ptr的引用计数都无法降到 0,导致其所管理的对象无法被释放,最终造成内存泄漏。 典型的循环引用场景: 双向链表节点相互引用 父对象持有子对象的shared_ptr,子对象同时持有父对象的shared_ptr 观察者模式中,观察者与被观察者相互持有shared_ptr 1.2 循环引用示例12345678910111213141516171819202122232425262728293031#include <memory>#include <iostream>class B; // 前向声明class A {public: std::shared_ptr<B> b_ptr; A() { std::cout << "A constructed\n"; }...
Leetcode 0028.Implement strStr()(python)
28. Implement strStr()你选用何种方法解题?本题的核心是实现字符串匹配算法。 方法 时间复杂度 空间复杂度 是否推荐 暴力匹配 O(n×m) O(1) 简单场景 KMP 算法 O(n + m) O(m) 推荐 方法选择理由: 暴力匹配:代码简单,适合短字符串 KMP 算法:时间效率更高,适合长字符串 解题过程问题分析输入:主串 haystack,模式串 needle输出:needle 在 haystack 中第一次出现的索引,不存在返回 -1 核心洞察 暴力匹配:逐个比较,不匹配时回溯 KMP 算法:利用部分匹配信息,避免不必要的回溯 暴力匹配算法流程以 haystack = "hello", needle = "ll" 为例: 1234i=0: h vs l -> 不匹配i=1: e vs l -> 不匹配i=2: l vs l -> 匹配,继续 i+j=3: l vs l -> 匹配,j=1 == lenn-1=1,返回 2 这些方法具体怎么运用?方法一...
Python sorted函数key参数深度解析
在Python中,sorted函数是一个强大的排序工具,而其中的key参数更是其最核心、最灵活的功能之一。本文将深入解析key参数的工作原理和使用技巧,帮助你在各种场景下优雅地实现排序需求。 一、key参数的基本原理key参数接收一个函数,这个函数会被应用到列表中的每一个元素上。sorted不会直接比较元素本身,而是比较这个函数处理元素后返回的"结果"。你可以把它想象成给每个元素贴一个"标签",排序是根据"标签"的内容来排,而不是根据元素本身。 二、key参数的三种传参方式1. 使用lambda表达式(最常用)当你需要快速定义一个简单的规则(比如按字典的某个键、按对象的某个属性)时,lambda是最方便的。 1234567891011users = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 20...
Leetcode 0027.Remove Element(python)
27. Remove Element你选用何种方法解题?本题的核心是原地移除数组中等于给定值的元素。 方法 时间复杂度 空间复杂度 是否推荐 快慢指针 O(n) O(1) 推荐 方法选择理由: 快慢指针:只需一次遍历,空间复杂度 O(1) 解题过程问题分析输入:数组 nums,目标值 val输出:移除目标值后的数组长度 关键约束: 原地修改数组,不能使用额外空间 不需要保持元素顺序 核心洞察 双指针技巧:使用两个指针,一个指向待填位置,另一个遍历数组 原地修改:直接在原数组上进行修改 算法流程以 nums = [3,2,2,3], val = 3 为例: 1234567891011121314初始化: num = 0(指向待填位置)遍历过程: i=0: nums[0]=3 == val=3,跳过 i=1: nums[1]=2 != val=3 nums[0] = 2, num = 1 nums = [2,2,2,3] i=2: nums[2]=2 != val=3 nums[1] = 2, num = 2 ...
C++ 用RAII实现智能指针
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980#ifndef SMART_PTR_H#define SMART_PTR_H// 基于RAII的智能指针实现,模拟unique_ptrtemplate <typename T>class SmartPtr {private: T* m_ptr; // 指向管理的资源public: // 构造函数:获取资源 explicit SmartPtr(T* ptr = nullptr) : m_ptr(ptr) {} // 析构函数:释放资源(RAII核心) ~SmartPtr() { delete m_ptr; // 自动释放资源 m_ptr = nullptr; ...
Python @classmethod 本质上就是C++ 的静态成员?
一、引言:一个跨语言的困惑当Python 中看到@classmethod 和cls 参数时,C++ 程序员的第一反应是“这有什么用?不就是个普通函数吗?”。但实际上,@classmethod 的存在是为了解决“类级别”的数据共享和操作,这与 C++ 的static 不谋而合。 二、 相同点:都属于“类”而非“对象”无论是Python 的@classmethod 还是 C++ 的static 函数,它们的核心特征都是一致的: 调用方式:都可以不创建实例,直接通过类名来调用 职责范围:它们处理的是与整个类相关的事务,而不是某个具体对象的私有数据 Python 的实现(@classmethod)12345678910111213141516171819202122232425class Person: # 类变量,所有实例共享 count = 0 def __init__(self, name): self.name = name # 每创建一个实例,就调用类方法来增加计数 Person.increment_count()...
Leetcode 0026.Remove Duplicates from Sorted Array(python)
26. Remove Duplicates from Sorted Array你选用何种方法解题?本题的核心是原地删除有序数组中的重复元素。 方法 时间复杂度 空间复杂度 是否推荐 快慢指针 O(n) O(1) 推荐 方法选择理由: 快慢指针:只需一次遍历,空间复杂度 O(1) 解题过程问题分析输入:有序数组 nums输出:删除重复元素后的数组长度 关键约束: 原地修改数组,不能使用额外空间 相同元素只保留一个 核心洞察 双指针技巧:使用两个指针,一个指向不重复元素的最后一个位置,另一个遍历数组 原地修改:直接在原数组上进行修改 算法流程以 nums = [1,1,2,2,3,4,4,5] 为例: 12345678910111213141516171819202122初始化: num = 0(指向第一个元素)遍历过程: i=1: nums[0]=1, nums[1]=1, 1 < 1 不成立,跳过 i=2: nums[0]=1, nums[2]=2, 1 < 2 成立 num = 1, nums[1] = 2 n...
C++ 资源管理
前言在 C++ 开发中,资源管理是确保程序稳定性、安全性和性能的核心环节。本指南系统介绍 C++ 资源管理的核心概念、实践方案与最佳实践,涵盖从基础内存管理到复杂资源类型的完整生命周期控制策略。 一、资源管理核心要素C++ 程序中需要管理的七类核心资源: 内存资源:动态分配的堆内存、缓存区等 文件资源:文件句柄、目录访问权限等 网络资源:套接字、连接句柄、端口等 图形资源:窗口句柄、设备上下文、纹理等 数据库资源:连接对象、事务句柄、游标等 线程资源:线程对象、互斥体、条件变量等 硬件资源:设备句柄、IO 端口、外设连接等 所有这些资源都遵循相同的管理原则:获取资源后必须确保其被正确释放,无论程序正常执行还是发生异常。 二、资源管理基本原则2.1 RAII:资源获取即初始化RAII(Resource Acquisition Is Initialization)是 C++ 资源管理的基石原则,其核心思想是: 资源的获取在对象的构造函数中完成 资源的释放在对象的析构函数中完成 利用 C++ 对象的生命周期自动管理资源生命周期 1234567891011121314151617...
Python函数:平方函数的完整实现
Python函数:平方函数的完整实现在Python中,函数是代码组织的基本单位。本文将介绍一个完整的Python平方函数实现,包括参数验证、异常处理和类型注解。 一、函数定义12345678910111213def square(n: int) -> int: """ 计算一个整数的平方 :param n: 输入整数 :type n: int :return: 输入整数的平方 :rtype: int :raise: ValueError """ if not isinstance(n, int): raise ValueError("Input must be an integer") return n * n 二、函数分析1. 函数签名1def square(n: int) -> int: 函数名:square,直观表示函数功能 参数:n,类型注解为int,表示接受一个整数 返回类型:-> in...
Leetcode 0025.Reverse Nodes in k-Group(python)
25. Reverse Nodes in k-Group题目Given the head of a linked list, reverse the nodes of the list k at a time, and return the modified list. k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes, in the end, should remain as it is. You may not alter the values in the list's nodes, only nodes themselves may be changed. Example 1: 12Input: head = [1,2,3,4,5], k = 2Output: [2,1,4,3,5] Example 2: 12Inp...
C++ 移动语义:从原理到实践
导言在 C++11 标准所引入的一系列创新性语言特性中,移动语义作为一种重要的语言机制,通过重新定义对象生命周期内资源转移的行为范式,显著提升了程序运行时的资源管理效率。该机制有效规避了传统临时对象拷贝操作引发的冗余资源复制开销,为构建高性能 C++ 应用程序提供了理论基础与实现路径。 一、移动语义的核心概念1.1 左值与右值的重新认知要理解移动语义,首先需要重新审视 C++ 中的值类别。在 C++11 之前,我们通常简单地将表达式分为左值(lvalue)和右值(rvalue),而 C++11 则将值类别体系进行了扩展: 左值:指可以取地址的表达式,通常有标识符,如变量名、数组元素等 右值:无法取地址的表达式,又细分为: 纯右值(prvalue):如字面量、临时对象、返回非引用类型的函数调用 将亡值(xvalue):即将被销毁的对象,通常是通过 std::move 转换的左值 1234int a = 42; // a是左值,42是纯右值int b = a + 5; // a+5的结果是纯右值std::string s = "hello&...
Python库与模块解析
哈佛CS50P课程的第四周专注于"资源库(Libraries)"主题,教授如何利用Python标准库和第三方包来提高开发效率。本文将详细介绍这一周的核心内容。 一、核心理念:代码复用1. 为什么要使用资源库David Malan教授指出:编程不应该总是从零开始。资源库是别人(或自己)编写的代码文件,旨在通过模块化(Modules)鼓励代码复用,避免机械的复制粘贴。 12345678# 不推荐:重复造轮子def calculate_circle_area(radius): import math return math.pi * radius ** 2# 推荐:使用已有的模块import matharea = math.pi * 5 ** 2 2. 模块化的优势 代码复用:避免重复编写相同的代码 维护性好:集中管理,便于更新 可读性高:代码结构清晰,易于理解 协作方便:团队成员可以共享使用 二、导入的艺术:import vs from1. import模块123456# 导入整个模块import random# 调用函数时需要带前缀random_...
Leetcode 3002. Maximum Size of a Set After Removals
3002. Maximum Size of a Set After RemovalsYou are given two 0-indexed integer arrays nums1 and nums2 of even length n. You must remove n / 2 elements from nums1 and n / 2 elements from nums2. After the removals, you insert the remaining elements of nums1 and nums2 into a set s. Return the maximum possible size of the set s. Example 1: 1234Input: nums1 = [1,2,1,2], nums2 = [1,1,1,1]Output: 2Explanation: We remove two occurences of 1 from nums1 and nums2. After the removals, the arrays become e...
Leetcode 0024.Swap Nodes in Pairs(python)
24. Swap Nodes in Pairs题目Given a linked list, swap every two adjacent nodes and return its head. You must solve the problem without modifying the values in the list's nodes (i.e., only nodes themselves may be changed.) Example 1: 12Input: head = [1,2,3,4]Output: [2,1,4,3] Example 2: 12Input: head = []Output: [] Example 3: 12Input: head = [1]Output: [1] 题目大意给定一个链表,两两交换其中相邻的节点,并返回交换后的链表头节点。要求不能修改节点的值,只能通过改变节点指针来实现交换。 你选用何种方法解题?本题的核心是两两交换链表节点。 方法 时间复杂度 空间复杂度 是否推荐 递归 O(n) O(n) 推荐 ...
C++ 类模板
一、模板类基本概念1.1 什么是类模板类模板是 C++ 泛型编程的核心机制,允许我们定义一个通用的类结构,该结构能与多种数据类型一起工作,而无需为每种类型重复编写代码。 类模板不是一个具体的类,而是类的 "蓝图",编译器会根据实际使用的类型参数生成具体的类实例(模板实例化)。 1234567891011121314151617181920212223242526// 简单的类模板示例template <typename T>class Box {private: T content;public: // 构造函数 Box(T value) : content(value) {} // 获取存储的值 T getContent() const { return content; } // 设置新值 void setContent(T newValue) { content = newValue; }};// 使用示例...
Leetcode 2356. 每位教师所教授的科目种类的数量
2356. 每位教师所教授的科目种类的数量表: Teacher 123456789+-------------+------+| Column Name | Type |+-------------+------+| teacher_id | int || subject_id | int || dept_id | int |+-------------+------+在 SQL 中,(subject_id, dept_id) 是该表的主键。该表中的每一行都表示带有 teacher_id 的教师在系 dept_id 中教授科目 subject_id。 查询每位老师在大学里教授的科目种类的数量。 以 任意顺序 返回结果表。 查询结果格式示例如下。 示例 1: 1234567891011121314151617181920212223242526272829输入: Teacher 表:+------------+------------+---------+| teacher_id | subject_id | dept_id |+------------+---...
C++ 函数模板
一、概述1.1 函数模板的定义函数模板是 C++ 泛型编程的核心,它允许定义带类型参数的函数原型,经编译器实例化后生成不同数据类型的函数,本质上是编译期指令。 1.2 函数模板的优势函数模板的核心优势体现在: 代码复用:类型参数化使一套模板适配多种数据类型,减少重复代码 类型安全:利用静态类型检查,规避编译阶段类型转换错误 高效执行:实例化函数直接嵌入,无运行时额外开销 1.3 应用场景函数模板常用于 STL 容器与算法设计、链表 / 栈等数据结构的类型无关实现,以及排序、查找等通用算法的多态封装。 二、基础语法2.1 模板声明函数模板的语法结构遵循以下范式: 1234template <typename T>返回类型 函数名 (参数列表) { // 函数体实现} 其中,typename关键字用于声明类型参数,class关键字在此语境下具备完全等价语义;T作为类型参数占位符,可根据实际需求替换为任意合法标识符。 2.2 简单示例:交换函数以数据交换操作为例,其模板实现如下: 123456template <type...
Python测试框架:pytest与assert断言
Python提供了多种测试工具,其中pytest是最流行的单元测试框架之一。本文将介绍Python中的assert语句以及pytest框架的基本用法。 一、assert语句1. 基本用法1234567# assert 条件x = 10assert x > 0 # 条件为True,无输出# assert 条件, 错误信息x = -5assert x > 0, "x必须大于0" # 抛出AssertionError 2. 常见用途12345678910def divide(a, b): assert b != 0, "除数不能为零" return a / bdef validate_age(age): assert 0 <= age <= 150, "年龄必须在0到150之间" return ageprint(validate_age(25)) # 正常# validate_age(-5) # 抛出AssertionError 二、pytest框架1. 基本安装和使...
Leetcode 2356. 每位教师所教授的科目种类的数量
2356. 每位教师所教授的科目种类的数量表: Teacher 123456789+-------------+------+| Column Name | Type |+-------------+------+| teacher_id | int || subject_id | int || dept_id | int |+-------------+------+在 SQL 中,(subject_id, dept_id) 是该表的主键。该表中的每一行都表示带有 teacher_id 的教师在系 dept_id 中教授科目 subject_id。 查询每位老师在大学里教授的科目种类的数量。 以 任意顺序 返回结果表。 查询结果格式示例如下。 示例 1: 1234567891011121314151617181920212223242526272829输入: Teacher 表:+------------+------------+---------+| teacher_id | subject_id | dept_id |+------------+---...

