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演讲】改掉坏习惯的简单方法
成瘾的原因是来自生物本性:
- 看到一个诱惑点,然后触发自己的动机
- 然后自己开始接收诱惑,大脑感受到快乐
- 然后不断重复这个过程
视频中介绍的改掉坏习惯的比较好的方法就是学会冥想,及时冥想不好的习惯的感受
简单一点的方法就是在自己做诱惑自己的事情的时候,利用人类本性的好奇,好奇一下这样做的感受是什么
这样就能仔细体会到是否真的让自己感到真正的快乐,而不是虚假的快乐
这样就可能可以找到不做这件事情的快感了
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)
}
|