【算法】交换字符 (2)

需求 给定两个字符串A和B,可以对A中的任意字符进行替换,如果要替换某个字符,则所有的此字符都要替换成相同字符。 需要判断字符串A是否可以通过字符替换得到字符串B。 例如,如果输入字符串A为“addca”,字符串B为“cookc”,则字符串A可以通过字符替换得到字符串B。 因为将A字符串中的字符'a'替换为'c','d'替换为'o','c'替换为'k'即可得到字符串B。 思路 需要判断输入的两个字符串相同位置的字符是...

[阅读更多 →]

【算法】交换字符 (1)

需求 输入两个字符串,如果交换第1个字符串中的两个字符后就可以得到第2个字符串,则表明这两个字符串可以相互转换。 例如输入“acb”和“cab”,可以满足转换。 思路 要满足转换条件,两个字符串需要满足如下条件: 如果两个字符串完全相同,则只有字符串中存在重复的字符时才满足条件(将重复的字符交换一次)。 如果两个字符串不同,则它们的长度需要相同,并且两个字符串只有两个位置的字符相异(假设为m位和位)。 判断字符串A...

[阅读更多 →]

【算法】根据字符出现的频率进行排序

需求 输入一个字符串,对字符串的字符进行排列,按照其中字符的出现频率降序进行排序。 思路 可以定义一个字典,字典的key是字符,value是出现的次数,然后按照value进行排序。 大部分语言都可以对字典排序,但是go不支持,需要定义一个切片再排序重组。 实现 package chapter03 import ( "sort" "strings" ) type Pair struct { ...

[阅读更多 →]

【算法】格式字符串进阶

需求 给定一个字符串,检查是否可以重新排列字符串,使结果满足如下条件: 相邻的字符不相同 如果满足条件,则返回任意可行的结果,否则返回空字符串。 比如,给定字符串 "aab",返回 "aba"。 思路 首先需要找到一种算法来不同都字符穿插排列。并非任何场景的输入都可以构成新的字符串,因此我们需要一种算法来检查是否可以构成新的字符串, 比如输入"aaaa",则无论怎么排列,都无法满足题目都排列要求。 实际上,如果能...

[阅读更多 →]

【算法】格式化字符串

需求 给定一个混合数字和字母的字符串,尝试编写程序对字符串进行格式化,使得新的字符串满足如下条件: 相同类型的字母不能相连,即数字的左右必须是字母,字母的左右必须是数字。 如果无法满足上述条件,则返回空字符串。 思路 根据需求,字符被分为数字型和字母型这两类,那么第一步就需要对字符进行分类。 分类完成后需要重新组合,如果这两类字符的数量大于1,则不能满足条件,返回空字符串。满足条件则取出字符重新排列成新的字符串。...

[阅读更多 →]

用 Go 的范型实现 MongoDB 的 CRUD 操作

MongoDB是一个非常强大的数据库,它提供了一个非常简单的接口,可以让我们在Go中使用它。 前几天用gin+gorm实现一个小功能,根据操作的方法,发现很容易实现通用的CRUD操作。 比如批量查询数据时,可以定义一个interface或具体结构体去绑定结果集: # 返回值也可以定义为interface{} func FindAllAd(filter interface{}, sort interface{}) ([...

[阅读更多 →]

gin + grom 实现分页功能

项目介绍 使用gin + gorm实现分页,按一般的mvc架构思想去划分目录,良好的编码习惯是用Dao层去查询数据库,Server层去实现业务逻辑(此案例业务逻辑简单所以没有封装)。 第三方库 gin gorm以及对应的mysql驱动包 目录结构 ├── README.md ├── config │ └── config.go ├── controller │ └── user.go ├── dao │ ...

[阅读更多 →]

Go + Vercel 实现简易每日早报

经常可以看到 每日60s读懂世界 就尝试用go实现, 另外对于Vercel的一键部署工具挺感兴趣的。 Vercel既可以用来做测试环境,也可以做生产环境,本质上是一个使用HTTP触发事件的Serverless应用, 项目在github上,想学习的可以去参考一下。 Vercel可以直接运行html文件和静态文件地址,但是接口就要另外定义,接口处理逻辑直接用go自带的http.Handle。 安装Vercel npm i...

[阅读更多 →]

使用 vscode 插件实现 leetcode 刷题

一般刷算法题我都是去leetcode官网,但每次都要去网页提交代码,想练习的时候还是有点麻烦,看到vscode有刷题插件就来推荐了。为了能正常使用该插件,需要先安装node。 可以直接去vscode搜索leetcode,一般排在第一的是下载量最高的,点击直接安装。 下载完之后设置节点: 这里选择中国节点: 设置好之后按shift+ctrl+p,在输入框输入leetcode,然后选择登录: 这里推荐使用cook...

[阅读更多 →]

golang 发送 application/x-www-form-urlencoded 类型请求

需要结合标准库url的Values结构体,比如: postData := url.Values{} postData.Add("name", "Chris") postData.Add("language", "golang") 普通post请求可以直接使用http.Post方法,第二个参数为application/x-www-form-urlencoded,如: response, err := http.Post...

[阅读更多 →]

Docker 实战:基础操作

最近的工作都要操作Docker,无论是在家里还是在公司,已经不用集成环境了,而且Docker还是部署在测试服务器上,本地只写代码,然后部署运行。早期我用过PHPStudy和Laragon,但后面需要操作的项目有点多,渐渐不能满足需求了,比如本地有的项目不支持php7以上版本,有的不能支持mysql8,或者想测试项目能不能在php8运行,如果用集成环境不是很方便,不能同时运行其它版本的应用。加上现在微服务很流行,微服务...

[阅读更多 →]

PHP 远程调试最佳实践

一般PHP开发环境是以本地环境为主的,少数人会用测试服务器做开发环境。当项目切换到正式环境时,有时为了测试线上某功能,或者修复bug时,以前都是通过写日志或者打印调试(如:var_dump),如果项目访问量很少,测试目标数据不多时,用这种方式调试问题不大。但是如果测试的数据比较多,那调试起来很繁琐,不断切换位置打印或写日志调试,很浪费时间。 遇到的问题 要实现PHP远程打断点调试,首先需要解决最大的问题是服务器怎么访...

[阅读更多 →]

golang 并发编程

CPU基本概念 要了解golang的并发编程,需要先简单了解cpu是什么? cpu是计算机的“大脑”,不仅能实现基本算术运算,还能通过总线控制和协调电子配件的输入和输出。我们编写的程序代码,比如打印语句,最终是由cpu从内存中取得指令、解码、执行。cpu执行指令速度非常快,通常执行一条指令只需要零点几纳秒。 早期的计算机是单核的,计算机设计师在设计体系结构为了能让处理器跑得更快,把cpu设计为交替地取得和执行指令。简...

[阅读更多 →]

PHPStorm 远程连接 Docker

服务器安装Docker后需要开启2375端口给外网访问,但是直接开启会有安全隐患,最好使用CA证书,为了方便操作,我直接弄了个shell文件,下载后直接在服务器上运行,运行成功后可以在/usr/local/ca目录下查看证书,并把ca.pem、cert.pem和key.pem下载到本地,等下要在PHPStorm上配置。 修改Docker配置 vi /lib/systemd/system/docker.service ...

[阅读更多 →]

简单用 golang 做并发爬虫

对于没有接触过swoole的PHP开发者,可能对于并发编程或异步编程比较陌生。并发编程就是在短时间内完成多个任务,以往我们都是一个任务完成后,再完成下一个任务。比如接下来采集的网站,我是分几个小模块进行处理,首先先采集章节的链接,然后在根据章节的链接获取内容,最后再把获取到的内容写到文件里。 安装依赖包 github.com/PuerkitoBio/goquery 处理文档,类似Jquery github.com/...

[阅读更多 →]