数学以及找规律
剑指 Offer 44. 数字序列中某一位的数字解题思路第一步:确定n所在的数字位数,记为digit;
第二步:确定n所在的数字,记为num;
第三步:确定n是num中的哪一位。
1. 确定所求数位的所在数字的位数
1234567start, digit, count :=1,1,9for count < n { n -= count start *= 10 digit ++ count = start * digit * 9}
2. 确定所求数位所在的数字1num := start + (n-1)/ digit // start就是第一位,所以要减去1
3. 确定所求数位在 num 的哪一数位12index := (n-1)%digitnumStr := strconv.Itoa(num)
复杂度分析:
时间复杂度 O(logn) : 所求数位 n对应数字 num 的位数 digit最大为O(logn) ;第一步最多循环O(logn)次;第三步中将 num 转化为字符串使用O(logn)时间;因此总体为O(logn) 。
空间复杂度O ...
必备电脑软件(持续更新)
截图——Snipaste官网Snipaste
记笔记——Typora网盘上传中….官网
快捷入口——Everything方便快捷插件——uTools一个朋友推荐的网址——kenrich壁纸——Wallpaper Engine思维导图——知悉Gif制作——ScreenToGif软件卸载——Geek播放软件——PotPlayer
Docker(一)
1.Docker简介1.1为什么需要Docker要如何确保应用能够在不同环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案——-系统平滑移植,容器虚拟化技术。安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
官网:Empowering App Development for Developers | Docker
仓库:Docker Hub
1.2容器VS虚拟机
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离, ...
MongDB
MongoDB的启动1docker pull mongo
1docker run -p 18000:18000 -p 27017:27017 mongo
安装插件
地址为:mongodb://localhost:27017/?readPreference=primary&ssl=false
删除目前这个连接,用下面的方式连接
我们可以修改成:mongodb://localhost:27017/coolcar?readPreference=primary&ssl=false
这样操作的时候,都会默认在coolcar数据库进行,如果没有这个数据库,也会默认创建
CRUD123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354user('coolcar') // 建立一个coolcar数据库db.sales.drop() //删除sales表db.account.insert({ open_id: & ...
测试规范
起一个docker环境来测试,测试完remove
安装go语言的Docker客户端1go get github.com/docker/docker/client
使用docker并自动remove掉
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849func main() { c, err := client.NewEnvClient() if err != nil { panic(err) } ctx := context.Background() resp, err := c.ContainerCreate(ctx, &container.Config{ Image: "mongo", ExposedPorts: nat.PortSet{ "27017/tcp": {}, }, ...
小程序登录功能实现(一)
微服务划分
登录小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系
调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
注意:
会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
临时登录凭证 code 只能使用一次
实现登录获取code步骤1:proto文件以及配置文件编写
在server文件夹建auth/api/auth.proto文件:
1234567891011121314syntax = "proto3";package auth.v1;option go_package="coolcar/auth/api/gen/v1;authpb&qu ...
结构调整->前后端接口统一
结构调整为了个小程序叠加上我们proto的类型需要引入第三方的包,为了引入第三方的包,需要对小程序的目录结构做一个调整,调整之后,就可以很方便的构建npm,引入一下ts,js的库。
所有目录的路径都是以miniprogram为根目录
步骤1:把typings下面的index.d.ts内容复制到miniprogram目录下,取名可以为appoptions.ts
步骤2:删除
步骤3:将其它的都移动到miniprogram目录下
步骤4:将所有目录为miniprogram/配置都删除,或者改为./
步骤5:删除tsconfig.json里面的typeRoots属性,可以根据npm拉下来的typing来定义。
步骤6:在小程序的文件夹安装protobufjs
在微信开发工具中重新导入项目,选择miniprogram目录打开。
1npm install protobufjs
步骤7:在miniprogram目录下创建如下文件夹,用来放protojs。
步骤8:在server/proto/gen.bat编辑下面代码用来生成ts,js文件
123456789protoc -I=. --go_o ...
GRPC实践
GRPC实践在trip.proto中
12345678910111213// 请求数据格式message GetTripRequest{ string id = 1;}// 返回数据格式message GetTripResponse{ string id = 1; Trip trip = 2;}// 服务service TripService { rpc GetTrip (GetTripRequest) returns (GetTripResponse);}
生成代码,为了生成service的代码框架,需要加参数plugins=grpc
1protoc -I=. --go_out=plugins=grpc,paths=source_relative:gen/go trip.proto
命令出错:
-go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to ...
GRPC(一)
[toc]
ProtoBuf使用安装
二进制流
语言无关描述来定义结构
安装ProtoBuf,然后需要配置环境变量
protoc帮助命令,运行成功表示安装成功。
去github搜索grpc-gateway有下面的安装教程
12345go install \ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \ google.golang.org/protobuf/cmd/protoc-gen-go \ google.golang.org/grpc/cmd/protoc-gen-go-grpc
如果不行,就一个一个安装。
hello world 创建proto文件夹,创建trip.proto文件
在vscode安装p ...