自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(154)
  • 收藏
  • 关注

原创 Python日期和时间完全指南与实战

日期时间看起来是最没技术含量的主题:拿当前时间、格式化、算差值,三行代码的事。但真实项目里,它是 bug 的高产区。原因在于这个领域有三个独立坐标轴——时刻、时区、日历规则——而datetime模块把这些轴拆成了不同对象,混用就会出错。常见的误解有这些:以为拿到的就是「现在的时间」(它其实是你机器本地时区下的墙上时间,换台机器结果就不同);以为有时区信息的时间可以和无时区的时间直接相减(不能,会抛TypeError以为strftime的格式符哪个都能随便用(%Y和%y%U和%W差别很大);

2026-11-14 03:51:03 99

原创 Python方法的重载和方法的覆盖

先把一个前提讲清楚:这个标题把"重载"和"覆盖"并列,容易让人以为 Python 同时支持两者。实际上 Python 只支持方法覆盖(overriding),不支持传统意义上的方法重载(overloading)。方法覆盖:子类定义与父类同名的方法,运行时调用的是子类的版本。这个 Python 完全支持。方法重载:在同一个作用域里,用同一个名字、不同的参数列表定义多个函数/方法,由编译器或运行环境根据实参个数或类型自动选择。Java、C++ 支持它,Python 不支持。

2026-11-14 03:49:50 201

原创 Python文件打开读取写入方法实用案例

open()不显式传encoding时,用的是平台默认编码。官方文档的原话是"默认编码依赖平台,即返回的值"。在中文 Windows 上这通常是cp936,在 Linux/macOS 上通常是 UTF-8。同一份 UTF-8 文本,在 Linux 上读得好好的,拿到 Windows 上就乱码或者直接。这不是文件坏了,是打开它的方式不对。另一个常见误解是"with只是为了少写一行close()其实with保证的是无论正常结束还是抛异常,文件都会被关闭——手写的f.close()

2026-11-14 03:48:43 130

原创 通过Python收集汇聚MySQL 表信息的实例详解

收集汇聚表信息」翻译成工程语言,就是生成一份数据字典:这个库里有哪些表、每张表有几个字段、字段类型和注释是什么、索引怎么建的、大致占多少空间。它最常见的三个用途是:写文档、做数据治理盘点、以及给别人交接时快速摸底。先说两个必须先纠正的认识。里的TABLE_ROWS是精确行数。不是。MySQL 官方文档明确写了:对 InnoDB 这类存储引擎,这个值只是 SQL 优化用的粗略估算值;同理,对 InnoDB 是「近似分配的簇索引空间」。所以它可以用来做容量趋势判断,不能用来做对账或报表。要精确行数只能。

2026-11-13 04:07:02 135

原创 跟老齐学Python之编写类之三子类

"子类"(subclass)是继承体系里那个"更具体"的类:父类描述共性,子类描述差异。本文把"怎么写一个子类"拆成一步一步的动作讲清楚,适合已经会定义类、但还没系统用过继承的读者。子类不会自动替你调用父类的__init__——子类一旦定义了自己的__init__,父类那份就完全被接管,必须手动调。子类不是父类的副本——覆盖(override)后父类版本就不在解析路径的优先位置了,要保留它得显式super()调。子类继承的是方法,不是值。

2026-11-13 04:06:10 147

原创 跟老齐学Python之开始真正编程

开始真正编程」这一步,跨的不是语法,而是心态:从「照着示例敲、跑出同样结果」变成「有个需求,自己想清楚结构,把它变成能运行的代码」。很多人卡在这里——教程都看得懂,一合上就写不出来。需要先说明一点前提:早期的《跟老齐学Python》系列是按Python 2.7写的,而Python 2.7 已于 2020 年 1 月 1 日停止维护。作者后来出了面向 Python 3 的新版(《跟老齐学Python:轻松入门》),并明确说「以前的版本是 Python 2,本书则为 Python 3」。

2026-11-13 04:05:19 174

原创 Python基础教程之名称空间以及作用域

"名字"在 Python 里指的是变量名、函数名、类名这些标识符。名称空间 (namespace)就是"名字到对象"的映射表——一个字典;作用域(scope)则是"哪段代码能直接看到哪些名字"的规则。程序里所有的NameError和,几乎都能用这两张图解释清楚。最常见的误解是:"我在函数里给一个变量赋值,应该就是改外面那个吧?恰恰 相反——只要函数体里对某个名字有赋值语句,这个名字在整个函数体里都被 当成局部变量,哪怕赋值发生在读取之后,也会报。这是初学 阶段最容易被绊住的一条规则。

2026-11-12 03:39:02 196

原创 Python基础指南之字符串格式化format()方法用法详解

格式化字符串」指的是把变量值嵌入一段文本模板的过程。运算符(printf 风格,最古老)、方法、f-string(格式化字符串字面量,3.6+)、以及 3.14 引入的模板字符串 t-string。其中是承上启下的一代:它比更清晰、更强大,又不像 f-string 那样要求变量必须在当前作用域可见,因此在配置文件模板、日志模板、需要把模板字符串单独存起来再填充的场景里仍然常用。初学者对format()的常见误解有两个。

2026-11-12 03:38:09 131

原创 Python基础必备之语法结构详解

学完零散的语法点之后,真正决定代码能不能写大的,是结构:数据怎么组织、逻辑怎么分层、状态放在哪、错误怎么收场。很多初学者写出来的程序「能跑但不敢改」,问题几乎都出在结构上——所有代码堆在一个文件顶层、状态全靠全局变量、出错就崩、函数改了这里坏那里。本文沿着「一个 Python 程序由哪些结构组成」这条线讲:变量与类型、程序的控制结构、函数与作用域、模块与包、异常结构。每个部分都只讲会实际影响正确性的规则,不铺常识。代码以 Python 3.8 及以上为基准。结构核心规则变量。

2026-11-12 03:37:16 130

原创 Python中for循环语句实战案例

很多人从 C 或 Java 转过来,会先入为主地把for理解成「计数器循环」——初始化、判断、自增三段式。Python 的for完全不是这个模型。它的语义是遍历一个可迭代对象(iterable),把里面的元素一个一个取出来。range(10)看起来很像个计数器,其实它只是"可迭代对象"里最常见的一种。这个理解差异会带来一批连锁误解:以为for循环变量有独立的块级作用域(其实泄漏到外层)、以为for一定要写(其实直接遍历元素更清晰)、以为会包含 5(它是左闭右开)。本文用一组实战案例把for。

2026-11-11 02:44:29 53

原创 python中eval函数使用与异常处理详解

eval()是内置函数里争议最大的一个:它能把字符串当成 Python 表达式求值,用起来非常方便——一个计算器、一段可配置的公式,几行就写完;但它同时是能执行任意代码的入口,官方文档在它的词条下直接挂了警告:用它处理来自用户的不受信任输入会导致安全漏洞。围绕eval()有两种典型误解。第一种是"我给globals传个空字典就安全了"——官方文档明确说明这不是安全机制,被执行的代码仍然能访问所有内置函数。第二种是把eval()和exec()eval只能求表达式并返回它的值,exec执行的是语句。

2026-11-11 02:43:35 56

原创 python中Class(类)的超详细说明

class是这门语言里唯一用来定义类的关键字,但它远比"给一组函数套个壳"复杂:它本身是一条可执行语句,类体在定义时就会被运行;它维护自己的命名空间,读取和赋值走的是不同规则;它还能被装饰器包装、被元类(metaclass)接管。很多人写了几百个类,却说不清"类定义执行那一刻到底发生了什么",一遇到__slots__、名称改写(name mangling)就卡住。本文不重复讲self和实例化怎么用(那是入门内容),而是把class。

2026-11-11 02:42:42 187

原创 PHP 7.2 老项目字符集报错怎么修复

老项目跑在 PHP 7.2 上,某天开始出现这类现象:页面中文变成??????;用户昵称里的 emoji 报;接口返回null而不是 JSON;日志里刷出。字符集(character set)与编码(encoding)在这条链路的某一环上不一致。一条完整的链路至少有五段:PHP 源文件本身、PHP 的、数据库连接的字符集、表和列的定义、以及 HTTP 响应的。任何一段没对齐,中文就会在那一环上被截断、替换或者直接报错。PHP 7.2 弃用了指令(该指令在 PHP 8.0 被彻底移除),并且新增了选项。

2026-11-10 02:42:08 28

原创 PHP 7.1 升级到 8.4 后报错怎么解决

从 PHP 7.1 直接升到 8.4,跨了 7 个大版本。上线之后最常见的画面是:首页白屏、日志里一片红,报错信息却各说各话——;;,明明 7.1 上只是一个警告;页面能打开,但金额判断、权限判断悄悄算错了,没有任何报错;日志被刷满。前三种是“硬失败”,改完就好;第四种最危险,因为它是静默的行为变更;第五种则是下一次升级(比如 8.4 升到 9.0)的预告。本文按“硬错误 → 行为变更 → 弃用告警”三类来组织,给出每一类的典型报错、原因和改法,并提供一个可以在 CI 里跑的扫描脚本。

2026-11-10 02:41:19 127

原创 本地PhpStudy新建站点,如何导入Laravel项目安装

很多人在本地用 PhpStudy(小皮面板)学 Laravel 时,第一步就卡住:面板里新建了站点,把 Laravel 压缩包解压到站点目录,浏览器一打开,看到的不是欢迎页,而是下面几种东西之一——Nginx 的 404、"Index of /" 目录列表、的源码原文,或者一个 500 白屏。原因不复杂。Laravel 是单入口(front controller)框架,所有请求都必须经过这一个文件;而新建站点时面板给出的默认根目录就是站点目录本身。只要站点根目录指向的不是public。

2026-11-10 02:40:27 209

原创 PHP8.1的枚举怎么实现接口和序列化

枚举(enum)是PHP 8.1引入的语言特性,标题里的版号是正确的。// 旧时代的写法,$status 可以是任何 int,没有任何约束,传错东西直接TypeError。接口(因为要复用统一的展示逻辑)和序列化(因为要进 JSON 响应、进数据库、进缓存)。本文就围绕这两件事展开:枚举怎么实现接口、UnitEnumBackedEnum这两个内置接口有什么用、对枚举到底做了什么、纯枚举(pure enum)与带值枚举(backed enum)在序列化上的差异,以及怎么把枚举安全地送进数据库再取回来。

2026-11-09 03:49:51 210

原创 PHP8.1怎么使用JWT实现用户认证

用 JWT(JSON Web Token)做接口认证的项目,出问题的姿势高度雷同:本地一切正常,上线后要么是「令牌永远不过期」,要么是「用户改了密码,旧令牌照样能用」,最糟糕的一种是安全扫描直接报出「签名可绕过」。根因通常不在 JWT 本身,而在于把它当成了一个「加密过的 cookie」。JWT 的前两段(header 与 payload)只是 Base64URL 编码,任何人拿到令牌就能解开、看到里面的全部内容;安全边界完全落在第三段的签名上。一旦签名校验写错——用==比较、不限定算法、拿到false。

2026-11-09 03:49:02 179

原创 PHP8.1怎么使用GD库处理图片缩放裁剪

用 GD 做头像和商品缩略图,是 PHP 里最传统的需求,但它翻车的姿势一直很稳定:上传竖拍的手机照片,生成的头像倒着躺;透明 PNG 缩放后背景变成黑色;一片 4000×3000 的照片处理到一半进程被 OOM Killer 干掉;用缩出来的图边缘发虚。EXIF 方向没有读、Alpha 通道在新建画布时没保留、内存占用没按"解码后的像素"算过、缩放的函数选错。PHP 8.1 在这个领域还带来一个值得一提的变化——GD 开始支持 AVIF 格式,可以用读取、用。

2026-11-09 03:48:14 165

原创 详解Dev C++使用教程(使用Dev C++编写C语言程序)

Dev-C++ 是国内高校 C 语言课上出镜率极高的一个工具。它的好处很直接:体积小、装完即用、不用配环境变量,点一下就能编译运行一个.c文件。但正因为"太好用",很多同学用了整整一学期,也没搞清楚自己到底在用什么。最常见的三个误解是这样的。第一个是把Dev-C++ 当成编译器——它不是,它只是一个图形界面(IDE,集成开发环境),真正的编译工作交给它捆绑的 GCC 完成。第二个是以为写 C 语言必须先"新建项目"——单文件的 C 程序直接新建"源代码"就行,只有多文件才需要项目。第三个是以为 .c和。

2026-11-08 02:55:01 154

原创 详解C/C++性能优化背后的方法论TMAM

TMAM(Top-down Microarchitecture Analysis Method,也常写作 TMA)是 Intel 提出的一套微架构性能分析方法。它要解决的问题很具体:程序慢,到底是没干够活干了白干的活取指/译码跟不上,还是执行或访存被卡住?传统做法是盯着某一个性能计数器(缓存未命中率、分支预测失败率)猜原因,TMAM 则从「CPU 每个周期可用的发射槽(slot)」出发,先把所有槽的去向分成几个互斥的大类,再逐层下钻。常见的误解有三个。第一,把 TMAM 当成一个工具。它是一套方法论。

2026-11-08 02:54:13 232

原创 详解C语言中动态内存管理

C 语言没有newmalloccallocreallocfree。它们只负责分配和释放原始字节,不调用构造,也不记录长度。因此「分配了多少、谁负责释放、释放后还有没有指针指向它」这三个问题,必须由程序员自己保证。最常见的错误是释放后继续使用(use-after-free)和重复释放(double free)。这两种错误在很多情况下不会立刻崩溃,而是悄悄破坏分配器的内部结构,等到程序运行到别处才出问题。另一个高频错误是realloc的返回值直接赋回原指针:扩容失败时返回NULL。

2026-11-08 02:53:14 216

原创 纯C++代码详解二叉树相关操作

二叉树是数据结构课程里出现频率最高的结构之一,但「会用」和「用对」之间有段距离。节点由谁拥有、递归的边界在哪里、删除节点后指针怎么接。这三件事只要有一件含糊,代码就会在某个测试用例上崩溃或泄漏。典型误解有这些。第一,认为「二叉树」和「二叉搜索树」是一回事——二叉树只规定每个节点最多两个子节点,不规定大小关系;只有二叉搜索树(binary search tree, BST)才保证左子树小于根、右子树大于根,中序遍历才有序。

2026-11-07 03:30:13 172

原创 简述C++的复杂性

C++ 太复杂」几乎和这门语言本身一样古老。有人把复杂性理解为关键字多、语法符号多;有人觉得它只是「带类的 C」,多学几个库就能掌握。这两种理解都偏了。C++ 的难点主要不在单个特性,而在特性之间的组合:同一段代码同时受重载决议、隐式转换、模板推导、对象生命周期和编译链接模型约束,任何一条规则变化,结论就可能翻转。这种复杂性有历史原因。C++ 从 C 继承了贴近硬件的表达能力和独立编译模型,又陆续加入了类、异常、模板、移动语义、lambda、并发和常量求值。

2026-11-07 03:28:55 145

原创 简明的C++函数指针学习教程

函数指针(pointer to function)保存的是函数的入口地址。它的经典用途有三个:把「行为」作为参数传进另一个函数(回调)、用数组实现跳转表、以及和只接受函数指针的 C 接口打交道(qsort、各种系统 API)。在 C++ 里,函数指针仍然有用,但已经不是首选。lambda、、模板和虚函数覆盖了大多数原本需要手写函数指针的场景。理解它仍然必要:读老代码、对接 C 库、以及理解「捕获的 lambda 为什么不能转成函数指针」,都绕不开它。典型误解之一,是把函数指针和成员函数指针混为一谈。与。

2026-11-07 03:27:32 208

原创 一文带你了解C++中queue的使用

std::queue是 C++ 标准库提供的先进先出(First In First Out,FIFO)容器适配器。它不自己管理元素存储,而是包装一个底层序列容器,只暴露队尾入队、队首出队这一组操作。默认底层容器是std::deque,也可以换成std::list。初学者对std::queue的误解主要集中在三点:第一,以为pop()会返回被删除的元素,实际它返回void;第二,以为queue像vector一样可以遍历,实际它不提供迭代器;第三,以为标准容器自带线程安全,于是多个线程直接对同一个queue。

2026-11-06 02:40:39 189

原创 一个C#开发者重温C++的心路历程

写了几年 C# 之后再回头看 C++,最容易产生的错觉是“语法差不多,应该很快上手”。ifforclassforeach、泛型、lambda 看起来都能对上号,Visual Studio 里甚至能用同一套调试器。真正动手写第一个非玩具工程时,问题会集中爆发:对象到底在栈上还是堆上、这个auto为什么推导出了副本、为什么改了一个函数签名就出现链接错误、为什么同样的代码在 Debug 下正常而 Release 下崩溃。这些问题的根源不是语法,而是两门语言对“对象生命周期”和“类型实例化”的模型不同。

2026-11-06 02:39:45 221

原创 windows调用C++动态库BOOL未定义的问题解决

自己编译.dll一点问题没有。error C2065: "BOOL": 未声明的标识符error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 interror C2146: 语法错误: 缺少 ";"(在标识符 "IsProcessElevated" 的前面)明明是在 Windows 上开发,BOOL怎么会"未定义"?答案是:BOOL从来不是 C++ 语言的一部分,它只是(更准确地说是<windef.h>)里的一行typedef。没包含那个头文件,它就不存在。

2026-11-06 02:38:50 184

原创 C++小游戏教程之猜数游戏的实现

猜数游戏(猜一个 1 到 100 之间的整数,程序告诉你「大了」还是「小了」)是学习一门语言时 最经典的小练习。随机数:随机种子怎么选、随机数怎么生成才没有偏置;输入:用户输入了abc或者直接按了 Ctrl+Z,程序会不会卡死;循环控制:什么时候提示、什么时候结束。初学者的典型写法是,再配一句。这套组合能跑, 但有偏置、可预测性差,而且rand()的质量完全交给实现去决定。本文用 C++11 起标准的<random>库重写一遍,并给出一个能正确处理非法输入的完整程序。所有代码按C++17。

2026-11-05 02:25:34 101

原创 C++将字符串格式化的几种方式总结

把数字、字符串按固定宽度和小数位拼成一行文本,是日志、报表、界面输出里最常见的操作。C++ 没有唯一的「格式化函数」,可选的路线有三条:继承自 C 的printf家族、C++ 流对象、以及 C++20 引入的。三条路线在类型安全、边界检查、可读性和工具链支持上差别很大。常见的误解有三个。第一,认为sprintf只是「老一点」,功能上没问题——它根本不知道缓冲区有多大,写超了就是缓冲区溢出。第二,认为流式输出一定比printf慢很多——这取决于实现和调用频率,标准并没有规定性能,不能一概而论。第三,认为。

2026-11-05 02:24:55 170

原创 C++将二叉树转为双向链表及判断两个链表是否相交

这篇把两个常被放在一起问的指针操作题放在一篇里讲。第一题是把一棵二叉搜索树(binary search tree, BST)原地转换成一个有序的双向链表,不新建结点,只改写指针;第二题是判断两个单链表是否相交,如果相交找出第一个公共结点。两题的共同点是:都不复杂,但都要求对指针的生命周期和遍历顺序有清晰的把握,写错一步就会丢链、成环或访问空指针。先说明前提。第一题针对的是二叉搜索树,不是任意二叉树——只有 BST 的中序遍历才天然有序,转换后的链表才有「有序」这个性质。

2026-11-05 02:24:18 93

原创 Linux搭建C++开发调试环境的方法步骤

很多人把「搭建 C++ 环境」理解成执行一条安装命令,装完g++就算完成。实际上,一个能支撑日常开发的 Linux 环境至少包含四层:编译器与标准库、链接器与二进制工具、调试器、构建系统。缺任何一层,都会在某个具体环节卡住,而报错信息往往不会直接指向缺失的那一层。第二个常见误解是把 IDE 当成环境本身。VS Code、CLion、Qt Creator 提供的只是编辑、索引和调试前端,真正干活的是底下的 GCC/Clang、GDB/LLDB 和 CMake。

2026-11-04 02:50:43 204

原创 linux下的C\C++多进程多线程编程实例详解

在 Linux 上写并发程序,绕不开两条路线:一条是多进程,用forkexecwaitpid这些 POSIX 原语把工作拆到彼此隔离的地址空间里;另一条是多线程,用 POSIX 线程或 C++11 的,让多个执行流共享同一份内存。这两个模型经常被放在一起讲,但它们的语义差别很大,混着用的时候尤其容易出错。常见的误解有三个。第一,以为fork之后父子进程共享变量——实际上fork。

2026-11-04 02:50:05 182

原创 C++和C的混合编译的项目实践

现实项目里,C 与 C++ 混编非常常见:底层驱动、编解码库、老代码用 C 写成,上层业务用 C++;或者反过来,C++ 实现的模块要以 C 接口暴露给其他语言调用。混编本身不难,难点在于链接期的名字匹配和两套语言规则的边界。最常见的问题是「undefined reference toC++ 支持函数重载,编译器会对函数名做名字改编(name mangling),把参数类型编码进符号名;C 不做改编,符号名就是函数名本身。

2026-11-03 04:49:40 163

原创 c++命名对象和匿名对象的解析

先澄清术语。中文语境里的「匿名对象」通常指临时对象(temporary object),也就是没有名字、由编译器在表达式求值过程中创建的类类型对象,比如或者a + b的结果。它和「命名对象」(named object,有标识符的变量)相对。需要说明的是,C++ 标准里并没有「匿名对象」这个术语,标准用的是「临时对象」;另一个容易被混进来的概念是匿名命名空间(anonymous namespace),那是限制链接性的机制,和本文讲的不是一回事。围绕临时对象的误解主要有三个。第一是以为。

2026-11-03 04:49:02 178

原创 C++右值引用与move和forward函数的使用详解

右值引用是 C++11 引入的最重要也最容易被误用的语言特性之一。它带来了移动语义和完美转发,让「避免不必要的拷贝」成为类型系统的一部分。std::move被当成「执行移动的函数」,被当成「更高级的 move」,T&&被一律当成右值引用,结果写出的代码要么没有真正移动,要么把对象移成了空壳还在继续使用。必须先立三条基本事实。第一,std::move不移动任何东西,它只是一个到右值引用的类型转换。第二,被移动的对象仍然有效。

2026-11-03 04:48:25 169

原创 C++一个函数如何调用其他.cpp文件中的函数

这就可以让我们自定义一个只包含main()函数的文件,通过在该函数中调用其他文件中的函数就可以将各个文件链接起来,而且更重要的一点就是,通过调用其他,cpp文件中的函数的时候,如果调用的某函数又调用了它自己文件中的一个函数,和我们的数据成员必须加extern不同的是,你只需把待调用函数的声明写在其头文件中,然后在主函数中直接用就可以。在该文件下可以自定义许多.cpp文件,但是需要注意的是这里面的各个文件只能有一个文件中含有main()函数,当然这里C++是提供一个文件调用其他文件中函数的功能的,

2026-11-02 01:27:25 211

原创 C++的异常处理详解

C++ 的异常处理由throwtrycatchthrow抛出一个异常对象,try划定可能抛异常的代码范围,catch按类型捕获并处理。它解决的问题是「错误从深层调用栈向上传递,而中间层不需要逐层检查返回值」。与返回错误码相比,异常不会被调用方无意忽略,但也带来了栈展开、异常安全和性能边界的额外要求。最常见的误解是「C++ 也有finallyC++ 标准没有finally关键字,那是 Java、C# 等语言的语法;

2026-11-02 01:09:45 145

原创 C++的字符串分割函数的使用详解

很多从 Python、Java 转过来的开发者,第一件事就是找。C++ 标准库没有提供字符串分割函数。没有split成员,<string>里也没有配套的自由函数。标准库提供的是更底层的工具——findsubstr——由开发者按需求组合。这种「不提供」并非疏漏。分割的语义有太多分歧:连续两个分隔符之间算不算一个空串?字符串以分隔符结尾时要不要追加一个空串?空输入返回空列表还是一个空串?多字符分隔符怎么处理?标准库若定死一种语义,反而会限制使用场景。因此常见做法是写一个符合项目约定的小函数,或者使用成熟库。

2026-11-02 01:08:37 173

原创 C++火车入轨算法的实现代码

火车入轨」通常指这样一类问题:编号为 1 到 n 的火车按顺序从入口进入一条栈式的侧线(siding),侧线只有一端开口,后进先出;火车可以从侧线驶出到出口。给定一个出站顺序,判断它是否能由这套结构产生。这个模型有几个必须提前说明的假设,否则题目没有确定答案:入口顺序固定为 1, 2, …, n;侧线是一条单栈,容量不限;每列火车只能整体进出,不能在侧线内解体或超车;出口按给定序列逐列出站。若把侧线想成队列(先进先出),能产生的序列会完全不同;若允许多条侧线,判定条件也会改变。

2026-11-01 23:49:28 318

原创 C++滑动窗口详解(优选算法)

滑动窗口(sliding window)不是某个标准库组件,而是一类用两个指针维护连续区间的算法套路。它把「枚举所有子数组/子串」的平方级做法,压缩成每个元素最多进出窗口一次的线性做法。真正让它成立的不是「有两个指针」这个外形,而是区间上的某个判定函数具有单调性:窗口扩张后条件一旦不满足,继续扩张也不会重新满足;或者窗口收缩后条件一旦满足,继续收缩仍然满足。缺了这条性质,硬套模板只会得到错误答案。常见的误解有三个。

2026-11-01 23:48:01 119

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除