2020面试小记
写在即将入职之际,算是对这一次的换工作的一次总结吧。从去年年底下定决心换工作开始准备到现在,也过去了将近半年的时间了,最后斩获了自己比较满意的offer。与之前的几次换工作经历相比,这一次大致做了如下准备。
面试前1.日常刷题之前工作算是非典型的互联网工作,每天会在闲暇之余会在leetcode或者lintcode刷刷题,一开始刷题是为了开拓开拓思路,同时加强算法的掌握度。刷题时大概用过两种方式,第一种是按照某一类型进行从简单到难的专项加强,当然做到有些Medium难度和Hard难度的时候,会出现找不到突破点的挫败感,这时候不妨先休息一下,换换脑子刷一些水题,提升兴趣度和成就感;然后再回过头来从新思考之前没做出来的题,如果还没有想到解法,这时候就推荐参考一下大神们的解题思路,但是不要就抄一下AC就完事了,要看明白怎么解,去思考为什么,知道了思路再尝试自己去编码实现。
不过说实话,难的问题感觉和天赋还是有关系的,到现在还是听到动态规划就望而却步
2.基础知识这里可能要分为两部分,一部分是计算机相关的基础知识,一部分是常用语言相关的基础知识。
计算机相关的基础知识像是数据结构和算法相关 ...
go学习笔记(四)——并发
1. goroutine什么是goroutinegoroutine是golang的最小执行单元,每个go程序至少会有一个主goroutine,这里可以类比成java中额主线程。为了更好的理解goroutine,可以将进程,线程和goroutine(其他语言中的协程)进行类比。
进程,线程和goroutine
进程是操作系统进行资源分配,调度和执行的基本单元。当操作系统分配一个进程时,会生成一个唯一对应的PCB块以及为该进程分配专有的系统资源。后续操作系统的调度会通过对应的PCB块来进行。
线程是程序执行流的最小单元,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。一般情况下进程与线程为1:n的关系,同一个进程生成的线程会共享改进程的堆上资源。通常情况线程的调度由操作系统内核态进行调度。
**协程(goroutine)**是更轻量级的线程,或者可以理解为用户态的线程。协程的调度实现答题可以分为两种,一种是用户态的调度实现,比如python中有名的gevent,就是通过用户态调度器实现协程间的调度,这种调度方式存在的一个弊端是由于调度完全是在用户态进行的,所以内核线 ...
从lintcode LFU引发的思考
题目24. LFU Cache
LFU是一个著名的缓存算法对于容量为k的缓存,如果缓存已满,并且需要逐出其中的密钥,则最少使用的密钥将被踢出。实现LFU中的set 和 get操作
题目的内容比较直观就是设计一个LFU缓存淘汰算法的实现,下面我们先来看下LFU的基本流程
LFULFU算法中会记录一定时间内每个Key的被访问次数,淘汰时会淘汰最近一段时间内被访问次数最少的key,当多个keys计数值为最小值时,按照LRU进行淘汰,如下图所示:
其他常见缓存淘汰策略FIFOFIFO是最简单的先进先出,使用Queue即可实现。
LRULRU是根据最近最少使用原则进行缓存淘汰的算法。顾名思义当需要进行页置换或者缓存淘汰时将最近最少命中的页或缓存剔除的算法,如下图:
解题思路HashMap + 小根堆时间复杂度 get : O(1) set O(logk)为了查询速度将缓存已key-value的形式保存在hashMap中,同时使用数组实现的小根堆来记录数据的访问频次情况,以便于淘汰策略进行淘汰操作。
LFU解题代码
java中优先级队列PriorityQueue解析PriorityQue ...
go学习笔记(三)——语法
1.变量变量是每种语言都不可或缺的声明方式,go提供了以下几种声明方式
12345var a stringvar a string = "a"var a = "b"a := "c" //只能在函数内使用var a,b,c string //同类型多变量的声明
需要注意的是,在go语言中声明的变量如果在接下来作用域中不使用,编译时会报xxx declared and not used错
除了上述几种声明,go语言还可用分组声明的方式
1234var( a int =1 b string = "a")
同时 go中还有一个特殊的变量,匿名变量(_)在表示接收但不会使用的变量
12dictValue := map(string)int{"test":1}value,_ := dictValue["test"]
当然除了上面的使用方式,匿名变量还有其他的作用,在稍后会做解释。
2.常量常量可以是字符、字符串、布尔值或数值。不支持 推断赋值(:& ...
go学习笔记(二)——基本数据类型
数据类型1.基本类型go语言中的基本类型如上图所示,go语言中有五类基数类型。
1) boolean型同其他语言一样,boolean包括两个值 true 和false
1var booleanVal boolean = true
2) 数值类型数值类型中可以分为三大类:整型,浮点型和复数
a.整型go语言中直接定义好了不同位数的整型,其中包括如下表所示类型
类型
备注
rune
int32的别称
int8
8位带符号整数类型
int16
16位带符号整数类型
int32
32位带符号整数类型
int64
64位带符号整数类型
byte
相当于uint8别称
uint8
8位不带符号整数类型
uint16
16位不带符号整数类型
uint32
32位不带符号整数类型
uint64
64位不带符号整数类型
注意:1.int的默认类型为int322.go语言中不支持隐式类型转换,哪怕是int8转int32,使用隐式类型转换会在编译器报错
123var a int32 = 123//编译报错cannot use a (type i ...
go学习笔记(一)——环境搭建
go安装和配置国内源下载
windows环境下,下一步安装法,即可完成安装
go中文文档 go包信息检索
go的常用命令go包含的命令 如下图:
常用命令
命令
可选参数
作用
备注
go build
-o 指定输出名称
将go代码文件编译成可执行文件
默认输出名称为package名称,使用build时,会忽略已”_”和”.”开头的文件
go install
go clean
清理当前项目中的
go get
从远程仓库获取代码包
同python的pip
go fmt
-w 写入到源文件
代码标准格式化
go test
执行单元测试(文件名为*_test.go)
IDE选择1.atom在atom上开发go
2. vs code安装请至官网选择对应版本进行安装
vscode实用快捷键
手动安装go需要的插件
vs code go插件安装失败问题解决
创建github.com下的插件12345678910111213141516171819202122232425262728cd $GOPATH/srcmkdir githu ...
Gitlab搭建和基本操作
由于近期工作的原因,项目中引入了gitlab作为规则引擎中规则版本进行管理,所以需要搭建gitlab,故记录下搭建过程已备以后查看。
1.安装本文是在centOS7 64环境下进行安装,gitlab安装版本为CE-9.5.9,使用官网下载的rpm包进行安(官网下载链接)
注意:gitlab对硬件至少4GB内存
依赖安装1234567[root@your-server ~]# yum install -y curl policycoreutils-python openssh-server[root@your-server ~]# systemctl enable sshd[root@your-server ~]# systemctl start sshd[root@your-server ~]# firewall-cmd --permanent --add-service=http[root@your-server ~]# systemctl reload firewalld##修改/etc/sysconfig/selinux 永久生效setenforce 0
gitlab安装 ...
2019再见2020你好
在罗同学的推荐下,看了《拍出绝世光线:摄影师的完美用光技巧解密》一书,看书的过程中觉得自己打通了任督二脉,可是实践后。。。然后千辛万苦挑出来了上面两张照片,当然也要感谢罗同学的友情配合,还有对于我这令人发指的人像水平的包容,以及孜孜不倦的鼓励。虽然依然没什么进步,但是还是要在这立个Flag——2020至少能拍出能看的人像吧。
都说晴西湖不如雨西湖,雨西湖不如雾西湖。西湖改变了之前我对阴天雨天的态度,之前一到阴雨天只想待在家中,享受被窝和睡眠,而看到了烟雨中的西湖却是另一番风味。当然能领略这不一样的西湖还有一个很大的原因,杭州的雨真的是多。稍显夸张的说杭州一年下雨的天数,感觉可以比得上兰州十年的下雨的天数了。
五一罗同学和我密谋了我们的honeymoon,当然也是罗同学带着我第一次走出了国门,当时的我那叫一个紧张,当然也有那么一点小兴奋。我们的第一次共同出国旅行,选择了相对难度不大的日本。当然日本的铁路交通还是给我们好好地上了一课,出门做错地铁做过站成了日常。印象最深的是我们在镰仓的时候,在镰仓社区中找到了一家很幽静的餐厅吃饭,老板是一对中年夫妻,他们不会中文,和我们 ...
第五届天池中间件比赛初赛总结
起源了解到天池程序设计大赛还是去年在网上逛博客的时候,看到有人分享了自己的参赛经历,和在参赛过程中一步步完善思路提高成绩的过程(附上链接)。就暗暗记下了这个比赛想要有朝一日自己也亲自操刀尝试一下。
赛题——自适应负载均衡的设计实现题目的内容是基于Dubbo的负载均衡算法实现,如上图所示,测评时提供三个配置和性能不同的provider节点。同时可以通过官方提供的辅助接口进行想过性能数据的采集。
可以通过provider的Callback获取provider的基本信息,包括最大线程数,内存使用信息等;提供了comsumer和provider端的Fliter可以进行请求情况的采集;provider端还提供了限流器TestRequestLimiter 来进行限流操作。
算法设计本次和队友各设计实现了一种负载均衡算法,答题思路都是通过固定时间窗口进行统计,根据统计值进行权重计算,来更新下一轮次的权重,同时根据权重选择节点采用了平滑加权轮训算法,来保证请求分配按照权重比例进行分配。算法一采用统计成功次数占比的方式来计算下个周期的权重,算法二采用统计平均rt的方式,在计算下一周期的各个节点的分配权 ...
人人网好友关系爬取
前言一开始准备爬取人人网的数据,是因为想把自己的人人数据做一个备份,结果后来就跑偏了,成了爬取好友关系网。(p.s.再一次成功跑偏)。作为拖延症重度患者,本来这个爬虫是在人人网被转卖的时候写好的,但是仅仅是把数据爬了回来,让数据安静的躺在家里的树莓派里。
准备要爬去一个网站的数据,首先是要对这个网站及这个网站中想要获取数据的数据接口进行分析。不同于上次大麦网(资讯类网站)数据的获取,这里解决需要用户的登录以及session保存的问题。人人网作为曾经风靡一时的社交类网站,对于登录认证还是做了一些加固的,不像有些网站明文密码传输。而是对于密码信息进行了加密处理。正好前一段时间尝试爬取一些漫画类网站的时候,有看到使用selenium+phantomjs模拟浏览行为的方式,获取动态加载的漫画图片。也是出于偷懒的心思,就决定试试用selenium+phantomjs来绕过人人网的登录。
尝试决定了使用seleium+phantomjs来作为这次爬虫使用的技术框架,就开始着手准备环境的搭建,总的来说环境搭建比较简单。
1.seleium安装
pip install seleium
2.ph ...


