Contents

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)
}