自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【LeetCode77】组合

回溯算法核心思想递归构造:用一个递归函数 backtrack 来构造组合,每次递归选择一个数字加入到当前组合 path 中。结束条件:当 path 的长度等于 k 时,将当前组合复制后加入结果集 res,然后结束当前递归分支。回溯撤销:递归调用返回后,使用 path.pop() 撤销上一次选择,从而恢复到上一步的状态,准备尝试其他选择。剪枝优化技巧在 for 循环中,通过判断 len(path) + (n - i + 1) < k 来判断剩余的数字数量是否足够凑齐 k 个数。

2025-04-07 19:53:05 383

原创 【Gorm】连接到数据库

DSN(Data Source Name)是一个字符串,用来告诉数据库驱动如何连接到数据库。理解 DSN 的构成有助于正确配置和调试数据库连接。:可以设置默认字符串长度、禁用 datetime 精度(适用于旧版本 MySQL)、处理索引重命名等。:DSN 字符串包含用户名、密码、数据库地址、端口、数据库名、字符集、时区以及其他参数。:支持使用 pgx 驱动,并可设置是否启用 prepared statement 缓存。:根据目标数据库选择对应的驱动包,例如 MySQL 使用。、PostgreSQL 使用。

2025-04-06 15:38:45 680

原创 【Gorm】模型定义

模型定义映射机制:GORM 将 Go 语言中的结构体(struct)映射为数据库中的表。定义模型就是编写对应的结构体。字段类型:模型字段可以使用基本类型(如uintstringuint8)、指针(如*string*time.Time)以及特殊类型(如)来处理可空值。自动管理的时间戳:如果定义了CreatedAt和UpdatedAt字段,GORM 会在创建和更新记录时自动填充当前时间。非导出字段:结构体中首字母小写的字段不会映射到数据库中。内置模型(gorm.Model)

2025-04-06 14:30:01 1926

原创 【LeetCode】二叉树的递归遍历

Preorder traversal order:Returns:list: A list of integers representing the preorder traversal.前序中序(同理)后序(同理)

2025-03-31 20:11:35 739

原创 【Go语言圣经5.1】

标准写法特点:明确地声明了参数和返回值,返回值直接在return语句中指定。命名返回值z = x - yreturn // 此处返回 z 的值特点:返回值z在函数体内被视作一个局部变量,函数结束时自动返回其值。使用空白标识符return x特点:使用忽略第二个参数,表示它不会在函数体内使用。省略参数名return 0特点:即使没有为参数命名,函数签名仍然明确为,但函数体内无法访问这些参数值。

2025-03-17 21:52:39 901

原创 【Go语言圣经3.6】

iota 常量生成器:iota 是一个强大的工具,可以方便地生成有规律的数值序列,适用于枚举、位标志、以及其他有序数值集合的定义。有一类常量称为“无类型常量”,这类常量在声明时不被赋予一个具体的基础类型,而是保持一种更“通用”的状态。这样做有两个好处:更高精度的运算:无类型常量在算术运算中拥有比具体类型(如 int 或 float64)更高的精度(可以看作有 256 位或更多位的精度)。灵活的隐式转换。

2025-03-17 21:37:23 1070

原创 【Go语言圣经3.1】

你有一个数字钟表,比如钟表上标有数字0到11。当你往前走时,比如从10走2步,就会变成0。两的补码就利用了这种“绕圈”的特性,把数字“绕回来”来表示负数。“两的补码”这个名字来源于它表示负数的方法:在二进制中,用一种方法把一个正数变成它的负数,而这个方法实际上就是用“2的幂”来做补数。因为2^n的基础是2,所以这种方法叫做两的补码。假设我们用8位二进制来表示数字,负数的表示其实就是“2^8减去正数”。比如-5此时是256-5。

2025-03-17 07:17:25 692

原创 【Go语言圣经2.6】

popcount算法解读想象一下你有一本“数字图鉴”,里面记着0到255这256个数字,每个数字旁边都写着它的“1的个数”。这个图鉴就是那个预先计算好的表格(pc数组)。预先计算图鉴(init函数)对于0到255中的每个数字,我们算一算它的二进制写法里有几个1,然后把这个数字和它的1的个数存进图鉴里。计算一个二进制数字的1的个数时,我们可以把它分解为“除以2后的数字”里的1的个数,再加上“最后一位是否为1”。

2025-03-16 21:08:48 588

原创 【Go语言圣经2.5】

type Celsius float64 // 定义摄氏温度类型type Fahrenheit float64 // 定义华氏温度类型// 常量声明const (AbsoluteZeroC Celsius = -273.15 // 绝对零度(摄氏)FreezingC Celsius = 0 // 冰点(摄氏)BoilingC Celsius = 100 // 沸点(摄氏)// CToF 将摄氏温度转换为华氏温度// FToC 将华氏温度转换为摄氏温度。

2025-03-16 17:28:21 563

原创 【Go语言圣经2.4】

理解可赋值性赋值语句要求左侧变量和右侧表达式的最终值必须有相同的数据类型:严格的类型匹配只有当右侧的值对于左侧变量是可赋值的,赋值才是允许的。如果类型不匹配,编译器会报错。特殊情况:nil 与常量与相等比较的关系对于使用 或 进行比较时,只有当右侧的值对于左侧变量可赋值时,相等比较才有意义。表达式求值顺序:变量的概念与内存模型:每个变量在内存中都有固定位置,赋值语句实际上更新该位置中的数据。最基本的赋值形式是将一个表达式的值赋给一个变量或可寻址的表达式。例如:基本变量赋值将整数 1 赋给变量 x。指针

2025-03-16 16:33:41 846

原创 【Go语言圣经2.3】

函数中返回局部变量地址:在 Go 中,返回函数中局部变量的地址是安全的,因为编译器会根据逃逸分析决定将该变量分配在堆上。每个变量在内存中都有一个地址。变量的生命周期决定了它们在内存中存在的时间长短,而作用域决定了变量在代码中可以被访问的范围。对同一变量取地址或复制指针,都为该变量创建了新的别名,通过 *p 访问到的就是同一个变量的值。会创建一个 T 类型的匿名变量,将其初始化为 T 的零值,并返回其地址(类型为 *T)。如果同一词法域中已有部分变量存在,那么“:=”会对已有变量进行赋值,同时声明新的变量。

2025-03-16 16:00:36 1870

原创 【Go语言圣经】2.2 声明

函数声明由函数名、参数列表、可选的返回值列表和函数体组成。如果函数没有返回值,则返回值列表可以省略。

2025-03-16 14:02:54 276

原创 【Go语言圣经】2.1

了解标识符(identifier)是用来命名变量、函数、类型等的名字。大多数编程语言都有类似的命名规则,但细节可能不同。命名规则:名字必须以字母(包括 Unicode 字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线大小写敏感性关键字(保留字):语言语法的一部分预定义名字(内建元素):为程序提供了常用的工具函数、类型和常量作用域与可见性

2025-03-16 13:48:27 658

原创 【go语言圣经1.6】

并发执行实例指的是程序中可以同时运行的多个任务或执行单元。这些任务可以独立执行,共享程序的资源,并在某种程度上并行或交替运行。goroutine是 Go 语言中用于实现并发执行的核心概念。它是一种轻量级的执行单元,由 Go 运行时调度管理,相比于传统的线程开销更低。每个 goroutine 都可以看作是一个并发执行实例,它们共同构成了程序的并发部分。每个通过go关键字启动的函数调用就是一个 goroutine,也就是一个并发执行实例。

2025-03-15 16:04:42 766

原创 【Go语言圣经1.5】

这段代码是串行处理每个 URL,但 Go 内置的并发机制(goroutine、channel)可以很方便地改造此程序为何在操作结束后需要关闭流(I/O流:文件流,网络流)操作系统为每个进程分配的文件描述符和网络连接数量是有限的。如果程序中频繁打开流而不关闭,长时间运行后会耗尽这些资源,导致后续无法打开新的文件或建立新的网络连接。不及时关闭流会导致资源泄露(Resource Leak),即占用的内存和其他系统资源不能被其他部分程序或其他程序使用。这种泄露会降低程序的性能,甚至引发系统崩溃或不稳定。

2025-03-12 21:40:43 2223 1

原创 【LeetCode110】平衡二叉树

将明确定义的递归步骤转换为代码或伪代码书写base case(s)在代码中,这通常以一个 if 语句的形式出现,该语句check base case 并立即返回一个值。如果f(n)是你的函数,展示f(n)是如何依赖f(n-1)或其它实例的通过arithmetic operations, concatenation, or some form of aggregation.合并子问题结果何时考虑使用辅助函数进行代码实现?

2025-03-12 20:31:36 458

原创 【go语言圣经1.3】

标准化输出 format格式化动词%d 十进制整数%x, %o, %b 十六进制,八进制,二进制整数。%f, %g, %e 浮点数: 3.141593 3.141592653589793 3.141593e+00%t 布尔:true或false%c 字符(rune) (Unicode码点)%s 字符串%q 带双引号的字符串"abc"或带单引号的字符'c'%v 变量的自然形式(natural format)%T 变量的类型%% 字面上的百分号标志(无操作数)转义字符。

2025-03-11 21:17:45 801

原创 【LeetCode222】完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(从第 0 层开始),则该层包含 1~ 2h 个节点。

2025-03-11 20:22:38 209

原创 【go语言圣经1.2】

字符串拼接的低效问题逐步拼接字符串(使用+=)在大规模数据拼接时会产生大量中间值,性能较低。使用是一种高效的解决方案,因为它在内部预先分配足够的空间,减少了不必要的内存分配和复制操作。

2025-03-10 21:26:41 386

原创 【Go语言圣经1.1】

packageGo 语言通过包来组织代码。包类似于其它语言的库librarries或模块modules,每个包通常对应一个目录,目录中的所有 .go 文件都属于同一个包。当代码使用声明时,表示这是一个可独立执行的程序而非一个库。程序的执行入口就是main函数import通过 import 语句,编译器能够识别代码中所需的外部依赖,若导入错误或缺少必要包,程序将无法编译。这种机制保证了代码的整洁和依赖的明确性主函数 func main是程序的执行入口。

2025-03-10 20:35:15 604

原创 【LeetCode111】二叉树的最小深度

该算法的运行时间为 O(n),因为每个节点最多处理一次。

2025-03-06 20:25:40 379

原创 【LeetCode104】二叉树的最大深度

base cases对于防止无限递归和处理空节点至关重要。

2025-03-06 19:58:03 236

原创 【LeetCode101】对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。对称:左右子树互为镜像这很显然暗示了一种递归方法确定base case(s)拆解问题与定义递归步骤组合子问题的解决方案

2025-03-06 19:49:11 245

原创 【LeetCode226】翻转二叉树

假设你有一个大盒子,里面装着一个小盒子,小盒子里又装着更小的盒子……一直到最小的盒子里什么都没有。每个盒子的结构都和大盒子一样,只不过尺寸变小了。解决问题的时候,你可以先解决最小盒子的问题,再一层一层往外解决,这就是递归的做法。递归就是类似这种“在里面还藏着同样的东西”的思想。(同样的东西,或许是同样的函数映射)简单来说,递归思想就是把一个大问题拆成和原问题很像但更小的问题,一直拆到最简单的时候再一步步合起来解决。这样的方法就叫做递归。形成递归解决方案/形成递归结构的通用模式。

2025-03-05 19:53:02 327

原创 【LeetCode347】前k个高频元素

通过 heapq.nlargest 可以很方便地找到前 k 大的元素,堆的大小始终保持为 k。通过使用堆来处理问题,而不是直接排序,能够避免 O(n log n) 的时间复杂度,提升到 O(n log k),其中 k 通常比 n 要小很多,因此能够有效提高效率。

2025-02-28 20:19:35 342

原创 【LeetCode459】重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

2025-02-26 20:36:17 265

原创 【LeetCode150】逆波兰表达式

去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )。给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’。输入是一个根据逆波兰表示法表示的算术表达式。

2025-02-26 19:56:00 261

原创 【LeetCode1047】删除字符串中的所有相邻重复项

入栈:使用 stack.append(char) 将字符压入栈中。出栈:使用 stack.pop() 移除栈顶的元素。使用 ‘’.join(stack) 将栈中的字符合并成最终的字符串。问题特性:反复操作:每次删除相邻的重复字符,必须在完成删除后继续检查。局部性操作:每次检查的是“最近添加”的字符,符合 后进先出(LIFO)模式。栈的优势:栈的优势后进先出:栈自然支持检查和删除“最近添加”的元素,适合逐个字符匹配和删除相邻重复字符。

2025-02-26 12:43:26 247

原创 【LeetCode20】有效的括号

在 Python 中,列表有以下几种方法可以帮助我们模拟栈的行为:append(x):将元素 x 推入栈的顶部(即列表的末尾)。pop():移除并返回栈顶部的元素(即列表的最后一个元素)。这两个方法完美地支持栈的基本操作(压栈和弹栈),因此我们可以利用列表来实现栈的功能。使用栈和哈希表处理括号匹配是常见的技巧.

2025-02-25 12:58:41 299

原创 【LeetCode18】四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 <= a, b, c, d < na、b、c 和 d 互不相同nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。仍然是排序 + 双指针不过比三数之和多套一层循环 三数之和

2025-02-24 20:36:10 398

原创 【LeetCode151】反转字符串中的单词

split() 方法:s.split() 会根据空格分割字符串,并且会自动去除多余的空格。如果字符串中有多个空格,split() 会自动忽略它们,只分割出单词。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。给你一个字符串 s ,请你反转字符串中 单词 的顺序。

2025-02-24 19:52:58 145

原创 【LeetCode541】反转字符串

由于字符串是不可变的,为了方便修改,我们将字符串转换为列表 result = list(s),修改完成后再转换回字符串。使用切片操作 s[start:end] 选取子字符串,结合反转操作 [::-1](切片操作的一种特殊情况),可以高效地反转字符串的指定部分。

2025-02-24 19:45:52 364

原创 【LeetCode344】反转字符串

双指针是解决很多线性数据结构问题的常见技巧。边界条件,例如当数组为空或只有一个元素时,不需要进行任何操作。双指针方法自然能处理这些边界情况,因为指针不会相交或交错。

2025-02-24 12:45:17 186

原创 【7days-golang/gee-web/day02】设计Context-学习笔记

Web服务通常基于两个重要对象:http.Request 和 http.ResponseWriter。但是,这两个对象提供的接口粒度较细,并且对于常见的 Web 服务响应(如 HTML、JSON)来说,需要多次重复配置,容易出错。比如,创建 JSON 响应时需要手动设置 HTTP 头信息、状态码等。如果没有封装这些常见操作,开发者每次都需要写大量重复的代码。因此,Context 提供了一个简化的接口,封装了这些常用操作,使得开发者只需要关注业务逻辑,不需要处理底层的 HTTP 细节。

2025-02-23 20:53:51 778

原创 【LeetCode15】三数之和

双指针技巧是一个经典的解决“找到两个数使得它们的和为某个数”的问题的方法。通过合理移动指针,可以高效地找到满足条件的数对。本题也可以理解为找到两个数,使它们的和等于-nums[i]

2025-02-21 20:04:27 151

原创 【gin-vue-admin002】initialize.OtherInit()

使用了 utils.ParseDuration 函数来转换字符串时间格式。接受一个字符串类型的时间表示,并将其转换为可用的 time.Duration 类型。SetDefaultExpire 方法用于设置缓存项的默认过期时间。

2025-02-20 20:44:38 165

原创 【LeetCode383】赎金信

Python 内置模块 collections.Counter 是一个非常适合频数统计的工具,能够方便地对字符串、列表等进行计数。其返回的字典可以直接使用键来查找字符的频次。

2025-02-20 20:17:09 296

原创 【LeetCode454】四数相加

dict.get(key, default) 用于在字典中查找 key 对应的值,如果不存在返回默认值 default。这在累加时非常方便。collections.defaultdict(int) 自动将不存在的键初始化为 0,避免在统计过程中需要额外判断键是否存在。哈希表计数:使用字典记录某些值出现的次数,方便后续查找。典型应用于“两数之和”、“三数之和”、“四数之和”等问题。分治思想其实也降低了时间复杂度。将高维问题拆分为低维问题(例如四重循环拆分为两个双重循环)是降低时间复杂度的常用技巧。

2025-02-20 19:56:28 150

原创 【Gin-Vue-Admin002】core.Viper()

Viper 是 Go 中最流行的配置管理库之一。很多项目使用 Viper 来加载配置文件,因为它简洁、功能强大,并且支持 YAML、JSON、TOML 等多种格式,支持从文件、环境变量、远程存储等多种源加载配置。在 Go 的很多项目中,你会看到配置加载被封装为一个单独的函数(通常是类似 GetConfig 或 LoadConfig 的函数),这些函数负责读取配置文件、环境变量、命令行参数等,返回一个配置管理器对象(如 Viper 或自定义的配置结构体)。

2025-02-19 22:56:19 543

原创 【LeetCode1】两数之和

哈希表查找:利用哈希表(字典)的 O(1) 查找特性,能够快速确定某个值是否已经出现过。通过在遍历过程中边查找边存储数据,可以将原本的双重循环优化为一次循环,显著降低时间复杂度。在数据规模适中的情况下,使用 O(n) 的额外空间换取 O(n) 的时间复杂度是一个很常见且合理的权衡。哈希表查找非常适合用来“寻找补数”,本题就是一个模板。enumerate 是 Python 内置的一个函数,用于在遍历可迭代对象(如列表、元组、字符串等)时,同时获取元素的索引和值。

2025-02-19 20:12:17 120

空空如也

空空如也

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

TA关注的人

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