动态规划
动态规划#
动态规划,简称DP,是解决很多重叠子问题的有效方法,每一个状态是由上一个状态推导出来的
动态规划我们一般需要从几方面去思考:
状态转换
构造子问题
动态规划与贪心算法
动规是由前一个状态推导出来的,而贪心是局部直接选最优的
思路
确定dp数组(dp table)以及下标的含义
确定递推公式
dp数组如何初始化
确定遍历顺序
举例推导dp数组
斐波那契数列#1 1 2 3 5……..
递归
123456func fib(n int) int { if n <= 1 { return n } return fib(n-1) + fib(n-2)}
遍历
12345678910111213141516171819func fib(n int) int { if n == 0 || n == 1{ return n } //时间O(n) 空间O(1) pre2 := 0 pre1 := 1 curr ...
基本的io接口
这里系统介绍一下基本的IO接口,平常在看项目的时候会发现很多 Reader ,ReadAt,Write,WriteAt 类型,因此这次来系统学习,归纳一下
Reader + Write==Reader==
12345678/* Reader is the interface that wraps the basic Read method.Read reads up to len(p) bytes into p. It returns the number of bytes read (0 <= n <= len(p)) and any error encountered. Even if Read returns n < len(p), it may use all of p as scratch space during the call. If some data is available but not len(p) bytes, Read conventionally returns what is availab ...
bytes
bytes库学习
其实我一直觉得Bytes和strings没啥区别,好吧,所以来看一看
Reader类型bytes 包下的 Reader 类型实现了 io 包下的 Reader, ReaderAt, RuneReader, RuneScanner, ByteReader, ByteScanner, ReadSeeker, Seeker, WriterTo 等多个接口。主要用于 Read 数据。
a Reader is read-only and supports seeking
The zero value for Reader operates like a Reader of an empty slice.
所以不妨把他理解成一个储物间,要往里面放东西,找东西
12345type Reader struct { s []byte i int64 // 当前读取下标 prevRune int // 前一个字符的下标,也可能 < 0}
初始化签名
1func NewReader(b []byte) *Read ...
sql与redis测试
Sqlmock
sqlmock是一个实现 数据库测试的Mock库,它不需要建立真正的数据库就可以测试CRUD一些操作,很方便
go get github.com/DATA-DOG/go-sqlmock
案例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package mainimport "database/sql"// recordStats 记录用户浏览产品信息func recordStats(db *sql.DB, userID, productID int64) (err error) { // 开启事务 // 操作views和product_viewers两张表 tx, err := db.Begin() if err != nil { return } defer func() { switch err { case nil: err = tx.Co ...
单元测试
单元测试
Golang的测试依赖于 ==go test== 命令,测试文件一般来说以 ==xxx_test.go== 格式,其中的代码不会被go build编译到最终的可执行文件中
==xxx_test.go== 文件中有三种类型的函数
类型
格式
作用
测试函数
函数名前缀为Test
测试程序的一些逻辑i行为是否正确
基准函数
函数名前缀为Benchmark
测试函数的性能
示例函数
函数名前缀为Example
为文档提供示例文档
单元测试函数一般来说来goland中创建一个文件名字格式为 x_test.go ,编译器就会自动把他变成测试函数的类型,如果你的函数名字格式写成 TestFunction 开头,自动会生成相应的形式,非常方便
123func TestName(t *testing.T){ //......}
其中 t 用于报告测试失败和附加的日志信息
123func (c *T) Error(args ... ...
strings库
普通操作1234567func main() { a := "aaaaaaaa" b := "bbbb" fmt.Println(strings.Compare(a, b)) // 比较,相等为0,不等为-1 fmt.Println(strings.Count(a, "a")) // a 中"a"字符有几个}
12345# output:-1truetrue8
大小写12strings.ToUpper("hhhhhhhh")strings.ToLower("HHHHHHHH")
是否包含某个字符12fmt.Println(strings.Contains(a, "a")) // 是否包含某个字符或者字符串fmt.Println(strings.ContainsAny(a, "b & a")) // 任意一个字符存在true
分割字符串1234567891011fun ...
发送email
之前不知道怎么发邮件的功能,记录一下
总体的功能实现是:要改密码,绑定/解绑邮箱的时候,我们就会给邮箱发信息确认。
1go get gopkg.in/mail.v2
==config.go==
12345email: address: xxxxxxx smtpHost: smtp.qq.com smtpEmail: xxxx@qq.com smtpPass: xxxxx
==email.go==
发送的实现其实并不是服务器内部决定的,而是通过QQ邮箱,相当于是将QQ邮箱当作代理,让QQ邮箱来帮我们发送邮件。
那么想要让QQ邮箱为我们发送代理,我们就需要QQ邮箱的权限,因此我们要想取开通一下权限
设置我们发送的邮箱类型(还可以选择其他邮箱)smtpHost
去网页里面开启权限,获得smtpPass,这个相当于权限的钥匙
我们要确认发送方的地址 SmtpEmailFrom
我们还要确认发送方的 姓名 subject
我们还需要设置一下给谁发邮箱,一般来说这个谁 需要 用户自己输入或者数 ...
贪心算法
贪心算法
理论基础局部最优推出全局最优,并且想不出反例
想不出反例就是随便想一下好了,不用严格证明
两个极端
贪心算法题目太简单(基于常识)
贪心算法题目太难(忽略尝试的地方)
套路: 无套路 策略: 举反例
贪心就是做过了所以知道了(看教课书上讲解贪心可以是一堆公式,估计大家连看都不想看,所以数学证明就不在我要讲解的范围内了,所以贪心不需要证明)
面试中基本不会让面试者现场证明贪心的合理性,代码写出来跑过测试用例即可,或者自己能自圆其说理由就行了。
总结:
贪心算法就是刷,没有套路,局部最优
分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
思路:没啥想说的
代码:
123456789101112131415func findContent ...
Joins有趣分享
原来的案例是 商城系统的收藏夹的关系,收藏夹里面需要有收藏用户,产品,产品用有人的信息,因此下面的结构如此体现,这样子设计非常巧妙,使用了belong to
123456789type Favorite struct { gorm.Model User User `gorm:"ForeignKey:UserID"` UserID uint `gorm:"not null"` Product Product `gorm:"ForeignKey:ProductID"` ProductID uint `gorm:"not null"` Boss User `gorm:"ForeignKey:BossID"` BossID uint `gorm:"not null"`}
下面的分别是用户和产品的
123456789101112131415type Product struct { ...
regexp
regexp
这个是golang中的一个包,其中包含所有操作列表,如过滤、修改、替换、验证或提取
中文名叫 正则表达式,至于为什么标题要写上面这坨,因为英文逼格比较高
正则表达式 用于使用特别的语法来搜索给定字符串中的特定字符集
语法菜鸟教程万岁
Regex
Meaning
.
匹配任何单一字符串
?
前面的字符最多能出现一次(一次或零次),runoo?b可以匹配runob或runoob
+
前面的字符必须至少出现一次,runoo+b可以匹配runoooob,runoooooob
*****
前面的字符可以不出现,也可以出现一次或多次,runoo*b可以匹配runoob,runob,runooooob
^
匹配输入字符串的开始位置
$
匹配输入字符串的结尾位置
|
指明两项之间的一个选择
[abc]
匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。
[a-c]
[A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
[^abc] ...