跳到主要内容

其他内容

需要了解并实现的特殊解法:

Morris 遍历

Floyd's Cycle Detection Algorithm(快慢指针)

Boyer–Moore 投票

轮转算法

快速幂

洗牌算法

特殊二分查找

快速选择

判断质数

最近公共祖先

最大公约数

数学与排列组合

拓扑排序

Dijkstra 算法

Bellman–Ford 算法

只需要了解的特殊解法

牛顿迭代法,KMP 算法,Prim 算法,Floyd-Warshall 算法

需要记下来的代码模版

二分查找 lower_bound, upper_bound,前缀树,前缀和,滑动窗口(找最长以及最短),单调栈,回溯,BFS,DFS,拓扑排序,Union Find,滚动哈希,快速选择算法

API 对比

以下为三种常见的编程语言 API 的对比表格,希望可以帮助你理解其他人的代码。

JavaPythonC++
ArrayList
  • arr.add(val)
  • arr.insert(i, val)
  • arr.get(i)
  • arr.set(i, val)
  • arr.remove(val)
List
  • arr.append(val)
  • arr.insert(i, val)
  • arr[i]
  • arr[i] = val
  • arr.remove(val)
vector
  • arr.push_back(val)
  • arr.insert(i, val)
  • arr[i]
  • arr[i] = val
  • -
LinkedList
  • ll.add(val)
  • ll.addFirst(val) / offerFirst(val)
  • ll.addLast(val) / offerLast(val)
  • ll.getFirst() / peek() / peekFirst()
  • ll.getLast() / peekLast()
Nonelist
  • ll.push_back(val)
  • ll.push_front(val)
  • ll.push_back(val)
  • ll.front()
  • ll.back()
Stack
  • st.push(val)
  • st.pop()
  • st.peek()
Stack
  • st.append(va)
  • st.pop()
  • st[-1]
stack
  • st.push_back()
  • st.pop_back()
  • st.top()
Queue
  • q.add(val) / offer(val)
  • q.poll() / remove()
  • q.peek() / element()
deque
  • q.append(val)
  • q.popleft()
  • q[0]
queue
  • q.push(val)
  • q.pop()
  • q.front()
PriorityQueue
  • q.add(val) / offer(val)
  • q.poll() / remove()
  • q.peek()
heap
  • heappush(q, val)
  • heappop(q)
  • q[0]
priority_queue
  • q.push(val)
  • q.pop()
  • q.top()
HashSet
  • s.add(val)
  • s.contains(val)
  • s.remove(val)
Set
  • s.add(val)
  • bool(val in s)
  • s.remove(val)
unordered_set
  • s.insert(val)
  • s.count(val)
  • s.erase(val)
HashMap
  • ht.put(i, val)
  • ht.get(i)
  • ht.remove(i)
Dictionaries
  • ht[i] = value
  • ht[i]
  • del ht[i]
unordered_map
  • ht.insert({i, val})
  • ht[i]
  • ht.erase(i)
TreeMap
  • bt.put(i, val)
  • bt.get(i)
  • bt.ceilingEntry(i)
  • bt.higherEntry(i)
Nonemap
  • bt.insert(i, val)
  • bt[i]
  • bt.lower_bound(i)
  • bt.upper_bound(i)
binarySearch
  • Collections.binarySearch(array, i)
  • -
bisect
  • bisect_left(arr, i)
  • bisect_right(arr, i)
binary_search
  • lower_bound(arr.begin(), arr.end(), i)
  • upper_bound(arr.begin(), arr.end(), i)
String
  • st.charAt(i)
  • st.compareTo(st2)
  • st.contains(i)
  • Integer.parseInt(i)
string
  • st[i]
  • st == st2
  • bool(i in st)
  • int(i)
string
  • st[i]
  • st.compare(st2)
  • st.contains(i)
  • stoi(i)

运算符优先级

基本规则

  1. 一元运算符优于二元运算符
  2. 乘除加减优于大部分运算符
  3. 位运算优于逻辑运算

Java

Java Operators

类别列表
括号()
前后缀与一元运算符++, --, !, ~, +, -
乘除加减*, /, +, -
位移>>, <<
判断与比较>, >=, <, <=, ==,
位运算&, ^, |, &&, ||
逻辑运算&&, ||
三元运算符? :
赋值=, +=, -=, ^=, >>=

Python

Python Expressions

类别列表
括号()
阶乘**
前后缀与一元运算符++, --, !, ~, +, -
乘除加减*, /, +, -
位移>>, <<
位运算&, ^, |, &&, ||
判断与比较>, >=, <, <=, ==,
逻辑运算&&, ||
赋值=, +=, -=, ^=, >>=

C++

C++ built-in operators, precedence, and associativity

类别列表
括号()
前后缀与一元运算符++, --, !, ~, +, -
乘除加减*, /, +, -
位移>>, <<
判断与比较>, >=, <, <=, ==,
位运算&, ^, |, &&, ||
逻辑运算&&, ||
赋值=, +=, -=, ^=, >>=

瓶颈期

以下为常见的瓶颈期以及解决方法

瓶颈期原因解决方法目标
不理解题目
  • 平时做题没有计时的习惯,不知道自己写代码所需的时间,所以通过快速阅读来争取时间,忽略了题目要点
  • 不够耐心和仔细
  • 仔细耐心阅读题目,边阅读边记下要点,如输入数据,限制条件等
  • 使用例子帮助理解题目
  • 对每题做题时间进行计时
五分钟内能够理解题目含义
不理解题解
  • 没有观察到题目的特点以及使用该数据结构或者算法的原因
  • 不熟悉题解描述的数据结构或者算法
  • 题目难度过高,涉及了多种数据结构或者算法
  • 仔细阅读多种类型的国区题解以及美区题解
  • 列出题解中的数据结构以及算法,逐个学习
  • 选择更低难度的题目
能够理解大部分官方题解
做过的题目无法 AC
  • 做题只追求通过,没有思考和总结
  • 没有学习多个解法,从而从不同角度看待问题,加深印象
  • 做完题目之后进行回顾与总结,尝试不同解法
  • 了解该类型题目的常用模式,使用场景以及常见错误
做过的题目基本能够做出来
不知道题目是什么类型
  • 无法有效观察以及分析题目
  • 不熟悉不同类型题目的特点
  • 学习官方题解的前期分析步骤,观察题目的特点
  • 总结不同类型题目的使用场景
能够判断题目大概是什么类型
有思路,但是写不对
  • 思路不够清晰,忽略了重要的细节
  • 写代码前认真思考每一个步骤
  • 写代码前先利用例子来证明思路的正确性
代码能够正确实现脑海中的思路
不记得具体的库以及 API
  • 对编程语言不够熟练
  • 不了解常用库
  • 阅读官方题解,学习什么情况下可以用标准库
  • 学习标准库的 API
正确写出具体库以及 API