每周完成一个ARTS
-
每周至少做一个 leetcode 的算法题
-
阅读并点评至少一篇英文技术文章
-
学习至少一个技术技巧
-
分享一篇有观点和思考的技术文章。
-
(也就是 Algorithm、Review、Tip、Share 简称ARTS)
Algorithm
3.无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
解法
思路:滑动窗口,两个指针分别表示子串的两个边界,用数组来保存字符的状态,0表示不存在,1表示已存在,当右边界向右滑动时,若新的元素不存在时,则继续向右滑动;若新元素已经存在时,则左边界向右滑动,直到新元素不再重复为止。
时间复杂度:O(n)
int lengthOfLongestSubstring(string s) { if (s.size() <= 1) { return s.size(); } int i = 0, j = 1; int str[128] = {0}; str[s[i]] = 1; int maxlen = 0; int len = 0; while(j < s.size()) { if (str[s[j]] == 0) { str[s[j++]] = 1; len = j - i; if (len > maxlen) { maxlen = len; } } else { str[s[i++]] = 0; } } return maxlen; }
Review
https://tour.golang.org/moretypes/1
-
指针
-
- go语言包含指针,指向一个值的内存地址
- T表示指向值T的地址,T的0值是nil
- &操作符生成操作数的指针
- *操作符表示指针所指向的值
- go语言没有指针运算
-
结构体
- 使用圆点.来访问结构体成员
-
结构体指针
- 结构体成员能够通过结构体指针进行访问
- 通过指针访问时,(*p).X访问成员X,但go语言允许以p.X的方式访问成员X
-
结构体常量
- 通过列出结构体成员的值,申请相应内存空间
- 可以只列出一部分成员的值,以Name:value的语法来指定位对应成员的值
- &可以返回对应结构体常量的指针
-
数组
- 声明形式:var a [num]T
- 数组的长度是类型的一部分,所以数组不能改变大小
-
切片
-
声明形式:a []T
-
数组赋值给切片,需要两个索引,高低边界,以:分隔
-
对应数组边界以[)半开取值,即包含第一个索引的值,但不饮食最后一个索引的值
- s包含primes的第一个值,但不包含其第四个值,即s为[2,3,5]
-
切片类似数组的引用
- 切片本身不存储任何数据,只是描述数组的一部分
- 改变切片的元素,即对应改变数组相应的元素,该数组的其他的切片共享该变化
-
切片常量
-
像没有长度的数组
-
默认切片
- [low:high]中的low与high均可省略
- [low:high]表示数组的low:high
- [low:]表示数组的low到最后
- [:high]表示数组0到high
- [:]表示数组全部
-
切片长度与最大长度
- 切片长度是指切片当前包含的元素个数
- 切片最大长度是指其对应上层数组元素的个数
- len(s)可得切片长度
- cap(s)可得切片最大长度
-
空切片
- 空切片为nil
- 长度与最大长度均为0
- 没有上层数组
-
通过make内存函数来创建切片
-
make([]T, len)创建长度、最大长度为len的切片,元素值为0
-
make([]T, len, cap)创建长度为len、最大长度为cap的切片,元素值为0
-
切片的切片
-
切片能包含任务类型,当然也可以包含其他切片
-
切片添加元素
-
append(s[]T, var...)
- 第一个参数为类型为[]T的切片
- 后面的参数为类型为T的变量
- 可将变量添加到切片中
-
如果切片的上层数组空间不足以添加被给的元素,则重新申请新的数组,返回值指向新申请的数组
-
range
- for循环遍历一个切片slice或map时,range迭代遍历器
- 遍历一个切片时,返回两个值,第一个是索引位置,第二个是该索引的元素值
-
-
map
-
map映射key value键值对
-
map的的空值是nil,nil没有key,key值也不能被添加
-
make函数返回一个给定类型的map
-
map变量
-
已赋值的map变量
-
若顶级的类型只是类型名,则可忽略类型名
-
map操作
- 插入或更新
- m[key] = elem
- 取得对应值
- elem = m[key]
- 删除
- delete(m,key)
- 测试键值
- elem, ok = m[key]
- 如果key是m中,则ok为true,elem为对应的值
- 如果key不在m中,则ok为false,elem为0值
-
-
函数值
- 函数值能够像其他值一样传递
-
闭包
- 闭包是一个可以引用函数体外部的变量的函数
Tip
利用的redis的单线程的特性,使用setnx命令来实现分布式锁
Share
-