广度优先遍历
剑指 Offer 13. 机器人的运动范围一类的模板类型
123456789101112131415161718192021222324252627282930var directs = [4][2]int{{-1,0},{0,-1},{1,0},{0,1}}var ans intfunc movingCount(m int, n int, k int) int { var visited = make([][]bool,m) for i:=0 ; i<m;i++{ visited[i] = make([]bool,n) } ans = 0 backtrack(visited,m,n,0,0,k) return ans}func backtrack(visited [][]bool,m,n,i,j,k int){ if i<0 || i>=m || j<0 | ...
树
剑指 Offer 54. 二叉搜索树的第k大节点遍历RNL(先Right再Node后Left)
123456789101112131415func kthLargest(root *TreeNode, k int) (res int) { var dfs func(*TreeNode) dfs = func(root *TreeNode) { if root == nil || k==0 {return} dfs(root.Right) k-- if k == 0 { res = root.Val return } dfs(root.Left) } dfs(root) return res}
剑指 Offer 34. 二叉树中和为某一值的路径注意:深拷贝。
123456789101112131415161718192021func pathSum(r ...
小程序-创建行程服务以及防止入侵
CreateTripProfileManager,CarManager,POIManager方法的实现先丢一边,需要考虑的是实际业务:
加入人的位置来防止恶意攻击;
行程必须是在车辆开锁前创建;
使用后台开锁,因为不管开锁是否成功,行程都已经创建了;
12345678910111213141516171819202122232425type Service struct { CarManager CarManager ProfileManager ProfileManager POIManager POIManager Mongo *dao.Mongo Logger *zap.Logger}// ProfileManager defines the ACL(Anti Corruptino Layer)// for profile verification logic.type ProfileManager interface { Verigy(context.Context, id.AccountI ...
身份信息的CRUD
[toc]
服务定义
profile可以不用看作一个实体类型,一个看成值类型
因为profile是和accountID绑定的,初始获取Profile应该是空值,如果是实体那就是nil,会报错。
下面的是加在rental.proto里,可以考虑重新用一个文件才存储
123456789101112131415161718192021222324252627282930// Profile Serviceenum Gender{ G_NOT_SPECIFIED = 0; MALE=1; FEMALE=2;}enum IdentityStatus { UNSUBMITTED=0; PENDING =1; VERIFIED=2;}message Profile{ Identity identity = 1; IdentityStatus identity_status=2;}message Identity{ string lic_number=1; string n ...
小程序-行程CRUD
结构定义在./rental/rental.proto定义业务,定义Trip
value object VS entity
value object:值相等就是同一个
entity:特有属性相等,其他不等,才是同一个,比如ID
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364syntax = "proto3";package rental.v1;option go_package="coolcar/rental/api/gen/v1;rentalpb";// value objectmessage Location{ double latitude = 1; double longitude = 2;}// 移动距离和钱是实时的,绑定的message LocationStatus{ Location locat ...
经典位运算
num出现一次,其余元素出现两次异或位运算。相同为0,不同为1
123456789class Solution { public int singleNumber(int[] nums) { int res = 0; for (int num : nums) { res ^= num; } return res; }}
num1出现一次,num2出现一次,其余元素出现两次思路:找出两个数在位上的不同特征。肯定会有一位他们两的异或是1。用这个特征进行分组,之后再用上面一题的思路来进行异或就可以找出他们
12345678910111213141516171819202122232425class Solution { public int[] singleNumber(int[] nums) { // 求所有数字异或和 int sum = 0; for (int num : ...
回溯
剑指 Offer 38. 字符串的排列
将字符 c[i] 和 c[x] 交换,即固定 c[i] 为当前位字符;
123456789101112131415161718192021222324252627func permutation(s string) []string { var res []string combinations(nil,0,[]byte(s),&res) return res}func combinations(current []byte, index int,src []byte, res *[]string){ var encountered = make(map[byte]struct{},0) if index >= len(src){ *res = append(*res,string(current)) return } for i:=index ; i<len(src); i++ ...
动态规划
剑指 Offer 60. n个骰子的点数——正向递推动态规划一般都是逆向递推,就是从结果来推理过程。这题是正向递推,从当前的数值推对后面结果的影响。
解题思路:
当前的概率是前面6个值承六分之一的和
f(n,x)= \sum_{i=1}^6(n−1,x−i)×\frac{1}{6}正向递推:当前的值对后面的6个值都有影响,即相加。
12345678910111213func dicesProbability(n int) []float64 { dp := []float64{(1.)/(6.),(1.)/(6.),(1.)/(6.),(1.)/(6.),(1.)/(6.),(1.)/(6.)} for i:=2;i<=n;i++{ tmp := make([]float64,5*i+1) for j:=0; j<len(dp); j++{ for k:=0 ; k<6;k++{ tmp[k+j] += dp[j]* ...
递归
剑指 Offer 17. 打印从1到最大的n位数考虑大数的情况
1234567891011121314151617181920212223242526var res []intvar count intfunc printNumbers(n int) []int{ res = make([]int,int(math.Pow10(n)-1)) count = 0 for digit:=1; digit<=n;digit++{ for first:='1';first<='9';first++{ num := make([]byte,digit) num[0]=byte(first) dfs(1,num,digit) } } return res}func dfs(index int, num []byte, digit int){ if i ...
小程序登录功能实现(二)
实现JWT步骤1:创建接口在auth/auth/auth.go定义token接口
123type TokenGenerator interface { GeneratorToken(accountID string, expire time.Duration) (string, error)}
在Service中加入TokenGenerator
1234567type Service struct { OpenIDResolver OpenIDResolver Mongo *dao.Mongo TokenGenerator TokenGenerator TokenExpire time.Duration Logger zap.Logger}
并在Login函数中使用
1tkn, err := s.TokenGenerator.GeneratorToken(accountID,7200)
步骤2:实现接口安装:
1go get github.com/dgrijalva/jwt-go
创建 ...