1. 查找
1 二分查找(简单)
1 | package main |
1 | package main |
1 | func reverseWords(s string) string { |
1 | func romanToInt(s string) int { |
两个套路,一个是递归遍历二叉树traverse() 无返回值 ,一个是分解处理子数,有返回值。
综上,遇到一道二叉树的题目时的通用思考过程是:
1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse
函数配合外部变量来实现。
2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值。
3、无论使用哪一种思维模式,你都要明白二叉树的每一个节点需要做什么,需要在什么时候(前中后序)做。
1 | package main |
头脑风暴: 临时数组++
1 | func findRepeatNumber(nums []int) int { |
1 | func merge(nums1 []int, m int, nums2 []int, n int) { |
复杂度分析主要从「时间」和「空间」两个维度来进行分析。
时间维度顾名思义就是算法需要消耗的时间,「时间复杂度」是常用的分析单位。
空间维度代表算法需要占用的内存空间,我们通常用「空间复杂度」来分析。
mac上写作markdown,个人感觉目前还没有比typora更优秀的工具(obsidian不服)。
SIGINT
信号,Ctrl-\产生SIGQUIT
信号,Ctrl-Z产生SIGTSTP
信号。SIGFPE
信号发送给进程。再比如当前进程访问了非法内存地址,,MMU会产生异常,内核将这个异常解释为SIGSEGV
信号发送给进程。kill(2)
函数可以发送信号给另一个进程。kill(1)
命令发送信号给某个进程,kill(1)
命令也是调用kill(2)
函数实现的,如果不明确指定信号则发送SIGTERM
信号,该信号的默认处理动作是终止进程。SIGALRM
信号,向读端已关闭的管道写数据时产生SIGPIPE
信号。