ARTS
ARTS 是陈浩(网名左耳朵耗子)在极客工夫专栏里发动的一个流动,目标是通过分享的形式来保持学习。
每人每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。
本周内容
本周的 ARTS 你将看到:
- LeetCode 200 Number of Islands 看起来是求连通域,实际上却在扫雷?
- Page Cache 到底是什么?
- 你是否在面试中遭逢过 PUA ?
Algorithm
本周要讲的是 LeetCode 200 Number of Islands. 这是一道求「连通域」的题目,即求被 0 突围的 1 的区域有多少个。
一个须要留神的点就是,遍历整个矩阵是无奈防止的,而一个「岛屿」可能蕴含多个 1,因而如何防止一个岛屿被反复的计算呢?一种简略的方法就是找到一个岛屿之后就将它的全副节点标记成 0. 这样就能够防止岛屿被反复计算。
那么如何把一个曾经找到的岛屿全副标记为 0 呢?最简答的形式就是 DFS, 发现某个点是 1 之后,对这个点的「上下左右」进行 DFS,晓得找不到 1 为止。
func numIslands(grid [][]byte) int {
var ans int
if len(grid) == 0 {return ans}
nc, nr := len(grid), len(grid[0])
var dfs func(c, r int)
// 通过深度优先遍历,将同一个岛全副置 0
dfs = func(c, r int) {grid[r] = '0'
if c > 0 && grid[c-1][r] == '1' {dfs(c-1, r)
}
if c < nc-1 && grid[r] == '1' {dfs(c+1, r)
}
if r > 0 && grid[r-1] == '1' {dfs(c, r-1)
}
if r < nr-1 && grid[r+1] == '1' {dfs(c, r+1)
}
return
}
// 开始扫雷!for c := 0; c < nc; c++ {
for r := 0; r < nr; r++ {if grid[r] == '1' {
ans++
dfs(c, r)
}
}
}
return ans
}
Review 文章举荐
本周看了一些 Page Cache 相干的内容,当然「科普」类型的居多,比方上面这篇 Page Cache, the Affair Between Memory and Files.
当应用 free 命令查看零碎内存应用状况时,个别会失去 6 列数据:total used free shared buffers cached
.
这里咱们临时只关怀最初两列,也就是 buffers 和 cached. buffers 代表间接读写块设施 (block device) 所应用的缓存页,cached 代表一般文件数据所占用的缓存页。
其实当咱们议论缓存时,实际上须要思考三局部。他们是: global_page_state(NR_FILE_PAGES)
total_swapcache_pages
i.bufferram
.
global_page_state(NR_FILE_PAGES)
顾名思义代表缓存页的总数。
total_swapcache_pages
指的是:没有关联任何文件的内存页,比方正在运行的代码通过 malloc() 申请的内存页,如果上述的内存页须要被换页时,那么这些内存页中的数据将被写入到 Swap Cache. Swap Cache 会关联一个或多个输出设备,比方裸盘或者文件。
i.bufferram
就是 free 命令倒数第二列 buffers.
而 free 的最初一列 cached 能够通过计算公式 global_page_state(NR_FILE_PAGES) – total_swapcache_pages – i.bufferram
失去。
Tip 编程技巧
啥是技巧?
Share 灵光一闪
PUA 本意是指专门通过某些「伎俩」搭讪女性的男性,因为这些「伎俩」中常常应用一些「打压」或者叫「贬斥」形式来「驯化」对方,因而 PUA 在这两年逐步成为人人喊打的一个群体。并且 PUA 这个词自身,也缓缓变得更加普适,甚至变成了网络流行语,泛指成心贬斥他人的行为。甚至有时候会当做动词来用,比方「我在面试中被 PUA 了」。
最近这段时间尝试加入了几个面试。我必须抵赖,我在常识积攒上还存在欠缺,无论是广度还是深度上。这可能导致我因为能力有余无奈通过一些面试,然而我也能判断出一些面试官的「好坏」,即面试官是否对面试做了「适当」的筹备。
很显著地,在有那么一两次面试中,面试官显然是没有做「适当」筹备的。疾速判断出这类面试官的形式就是,看他是否能对你的答案进行点评,并且是否能依据你的答案进行更深度的开掘,找到你常识储备的边界。如果一个面试官对他所问的问题没有深刻的理解,或者没有主管的意识,那么他就只能通过你的答案「内容之外」的货色来做判断。比方你是否用了一些不确定的语气词,或者你自身表白的语气等等,或者说这种面试官切实考「感觉」来做判断。
如果你也在面试中遇到了,只是否定你的能力,然而不对他的否定根据具体解释的状况。强烈建议间接反诘面试官:是否能够指出具体哪个问题的答案没有达到你的要求以及为什么?当然,如果这个面试官真的是靠感觉来判断的话,他这个时候很可能会想方法回绝侧面答复这个问题。这个时候你能够抉择硬刚到底,肯定要面试官说进去,到底哪个问题的答案有问题。也能够抉择放弃挣扎,因为无论刚还是怂,最终的后果都是节约一个小时。
本周浏览列表
- 极客工夫 MySQL 实战 45 讲
09 | 一般索引和惟一索引,应该怎么抉择? - Page Cache, the Affair Between Memory and Files
-
Go Context 曹春晖
cancelCtx 类型都会持有一个本人的 channel 专门用来做敞开告诉,并且也会持有所有 children 的 cancel 办法,用来敞开所有 children 的 done channel. 这最终会造成一种树形构造。
这样做的益处就是,防止所有的 ctx 都是用同一个 Done() 函数,因为应用同一个 Done() 意味着大家竞争同一把锁。 -
FREE 命令显示的 BUFFERS 与 CACHED 的区别
介绍 free 命令的最初两列buffers
和cached
别离代表什么。