ARST打卡第174周[174/521]

Algorithm

lc1582_二进制矩阵中的特殊位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// numSpecial 找出矩阵中十字里唯一是1的个数
func numSpecial(mat [][]int) int {
check := func(mat [][]int, x int, y int) bool {
xlen := len(mat)
ylen := len(mat[0])
// 先对x行的y个值进行检测
for j := 0; j < ylen; j++ {
if j == y {
continue
}
if mat[x][j] == 1 {
return false
}
}

// 再对y列的x个值进行检测
for i := 0; i < xlen; i++ {
if i == x {
continue
}
if mat[i][y] == 1 {
return false
}
}
return true
}

xlen := len(mat)
if xlen == 0 {
panic("wrong input")
}
ylen := len(mat[0])
if ylen == 0 {
panic("wrong input")
}
ans := 0
for i, row := range mat {
for j, v := range row {
if v == 1 {
if check(mat, i, j) {
ans++
}
}
}
}
return ans
}

/*
numSpecialAns 预处理行列的方式比我的暴力方法快,还有一种是压缩到第一行的,
理解起来比较复杂,不易读,自己理解一遍就行,不贴出来了
*/
func numSpecialAns(mat [][]int) (ans int) {
rowsSum := make([]int, len(mat))
colsSum := make([]int, len(mat[0]))
for i, row := range mat {
for j, x := range row {
rowsSum[i] += x
colsSum[j] += x
}
}
for i, row := range mat {
for j, x := range row {
if x == 1 && rowsSum[i] == 1 && colsSum[j] == 1 {
ans++
}
}
}
return
}

Review

【TED演讲】改掉坏习惯的简单方法

成瘾的原因是来自生物本性:

  1. 看到一个诱惑点,然后触发自己的动机
  2. 然后自己开始接收诱惑,大脑感受到快乐
  3. 然后不断重复这个过程

视频中介绍的改掉坏习惯的比较好的方法就是学会冥想,及时冥想不好的习惯的感受

简单一点的方法就是在自己做诱惑自己的事情的时候,利用人类本性的好奇,好奇一下这样做的感受是什么

这样就能仔细体会到是否真的让自己感到真正的快乐,而不是虚假的快乐

这样就可能可以找到不做这件事情的快感了

Tips

在MegaEase工作是一种怎样的体验

可以参考借鉴一下MegaEase的软件工程的方法,不要自己造轮子,学习最优秀的实践,从而增加成功率

Share

读写锁先读后写,defer处理不优雅,所以包装get处理保持优雅

defer丑陋处理示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import (
"fmt"
"sync"
)

type fruit struct {
Mutex sync.RWMutex
name string
color string
m map[string]int
}

func main() {
d := &fruit{name: "apple", color: "red"}
fmt.Println(d)
if d.m == nil {
fmt.Println("d.m is nil")
}

d.Mutex.RLock()
write := false
defer func() {
if !write {
d.Mutex.RUnlock()
}
}()

fmt.Println(d.name)

if d.m == nil {
d.Mutex.RUnlock()
write = true
d.Mutex.Lock()
defer d.Mutex.Unlock()
d.m = make(map[string]int)
d.m["hello"] = 1
}

fmt.Println(d)
}

封装get函数保持优雅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"fmt"
"sync"
)

type fruit struct {
Mutex sync.RWMutex
name string
color string
m map[string]int
}

func getSome(f *fruit) string {
return f.name
}

func main() {
d := &fruit{name: "apple", color: "red"}
fmt.Println(d)
if d.m == nil {
fmt.Println("d.m is nil")
}

d.Mutex.RLock()
fmt.Println(getSome(d))
d.Mutex.RUnlock()

if d.m == nil {
d.Mutex.Lock()
defer d.Mutex.Unlock()
d.m = make(map[string]int)
d.m["hello"] = 1
}

fmt.Println(d)
}