66. 加一

题目 给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0。 将大整数加 1,并返回结果的数字数组。 示例 1: 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。 加 1 后得到 123 + 1 = 124。 因此,结果应该是 [1,2,4]。 示例 2: 输入:digits = [4,3,2,…

Golang - 匿名函数

在 Go 中,匿名函数(Anonymous Function),也称为函数字面量,是指在代码中直接定义的、没有函数名的函数。它们是一等公民,意味着可以像任何其他类型(如 int、string)的值一样被使用。 基本语法 func(参数列表) (返回值列表) { // 函数体 } 常见用法 a) 直接调用(立即执行函数 IIFE) 定义后立即用 () 调用,通常用于创建一个临时的作用域。 func main() { // 定义并立即调用 func() { fmt.Println("这是一个直接调用的匿名函数!") }() } b) 赋值给变量 可以将匿名函数赋值给一个变量,然后通过这个变量来调用它。 func main() { // 将匿名函数赋值给变量 add add := func(a, b int)…

Golang - 并发

Goroutine Goroutine是一个轻量级的独立任务执行单元。 想象一下你是一个项目经理(主程序 main 函数),你有很多任务需要完成。 * 传统方式(没有并发): 你必须亲力亲为,做完任务A,才能开始任务B,再开始任务C。效率很低。 * 传统多线程方式: 你可以雇佣几个全职员工(操作系统线程)。每个员工都很能干,但雇佣和管理他们(创建、销毁、切换)的成本很高,比如要给他们配独立的办公室、电脑等(独立的内存堆栈,系统资源开销大)。你雇不了太多员工。 * Go 协程方式: 你雇佣了一个总管(Go 运行时),然后你只需要把任务写在小纸条上,交给总管。总管手下有一群临时工(Goroutines),他们非常轻量,只需要一张小板凳就能坐下干活(内存占用极小,通常只有几 KB)。你下达一个指令 go doSomething(),总管就会派一个临时工去做。成千上万个临时工对他来说都不是问题,管理成本极低。 创建 Goroutine…

Golang - 堆的实现

接口要求 Go 的标准库 container/heap 定义了一个接口(heap.Interface),我们只需要让自己的数据类型满足这个接口,然后就可以使用 container/heap 包里提供的 Init, Push, Pop 等函数来对我们的数据进行堆操作。 核心就是实现 heap.Interface 接口。这个接口包含了 sort.Interface 的三个方法和它自己定义的两个方法。 heap.Interface 的定义如下: type Interface interface { sort.Interface // 包含了 Len(), Less(i, j int) bool, Swap(i, j int) Push(x any) // 在末尾添加元素 Pop() any…

Golang - 泛型

类型参数 (泛型) 泛型允许你编写不关心具体类型的函数或数据结构。就像C++的模板一样,你可以写一个 Index 函数,它既能在一个 []int 中查找 int,也能在一个 []string 中查找 string,而无需为每种类型都重写一遍函数。 Go 语言泛型函数: func Index[T comparable](s []T, x T) int 约束 (Constraints):comparable 的作用 这是Go泛型与传统C++模板(C++20之前)一个非常重要的区别,也是Go泛型设计的核心优势。 * 什么是约束? 约束(Constraint)是对类型参数 T 的一种“要求”或“规定”。它告诉编译器,任何用来替换 T…

Golang - 方法与接口

方法 虽然Go没有 class 关键字,但通过为自定义类型(主要是struct)附加方法,它可以实现与C++类非常相似的功能,只是语法和组织方式不同。 对于有C++背景的你来说,理解这一切的关键在于: Go的方法接收者 (Receiver),在功能上与C++类成员函数中的 this 指针是完全等价的。 1. 语法与定义 我们来详细对比一下定义一个类型和其方法的语法。 C++ 语言: 在C++中,方法(成员函数)的定义是包含在 class 或 struct 的大括号内部的。 #include <iostream> #include <cmath> class Vertex { public: double X, Y; // 方法定义在 class 内部…

Golang - 更多类型

指针 Go语言沿用了C/C++中关于指针的两个核心操作符 & 和 *,它们的含义是完全一样的。 * & (取地址操作符 - Address-of Operator) * Go: &i 会生成一个指向变量 i 的指针。 * C++: &i 同样会生成一个指向变量 i 的指针。 * * (解引用操作符 - Dereference Operator) * Go: * 在类型前面,如 *int,表示“一个指向int类型的指针”的类型。 * 在指针变量前面,如 *p,表示获取该指针指向的底层值。 * C++: * 在类型前面,如 int* 或 int *,表示“一个指向int类型的指针”的类型。 * 在指针变量前面,如…

Golang - 流程控制语句

for循环 1. 标准的三段式 for 循环 C++ 语言: for (int i = 0; i < 10; ++i) { // C++需要括号 std::cout << i << std::endl; } Go 语言: // 注意:没有圆括号 (),但花括号 {} 是必须的 for i := 0; i < 10; i++ { fmt.Println(i) } // 变量 i 的作用域仅限于这个 for 循环内部 关键不同点: 1. 无圆括号…