编程面试的10大算法概念汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编程面试中排名前10的算法
通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。本文将从Java的角度看问题,包含下面的这些概念:
1. 字符串
2. 链表
3. 树
4. 图
5. 排序
6. 递归vs. 迭代
7. 动态规划
8. 位操作
9. 概率问题
10. 排列组合
1. 字符串
如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。
1 2 3 4 5 6 toCharArray() // 获得字符串对应的char数组Arrays.sort() // 数组排序
Arrays.toString(char[] a) // 数组转成字符串charAt(int x) // 获得某个索引处的字符length() // 字符串长度
length // 数组大小
2. 链表
在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。
1 2 3 4 class Node { int val;
Node next;
5 6 7 8 9 Node(int x) { val = x;
next = null; }
}
链表两个著名的应用是栈Stack和队列Queue。栈:
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19 class Stack{
Node top;
public Node peek(){
if(top != null){
return top;
}
return null;
}
public Node pop(){
if(top == null){
return null;
}else{
Node temp = new Node(top.val); top = top.next;
return temp;
}
20
21
22
23
24
25
26
27
28 }
public void push(Node n){ if(n != null){
n.next = top;
top = n;
}
}
}
队列:
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16 class Queue{
Node first, last;
public void enqueue(Node n){ if(first == null){
first = n;
last = first;
}else{
last.next = n;
last = n;
}
}
public Node dequeue(){
if(first == null){
return null;
17
18
19
20
21
22
23
24
}else{
Node temp = new Node(first.val);
first = first.next;
if(last == temp) last = first;
return temp;
}
}
}
3. 树
这里的树通常是指二叉树,每个节点都包含一个左孩子节点和右孩子节点,像下面这样:
1 2 3 4 5 class TreeNode{ int value;
TreeNode left; TreeNode right; }
下面是与树相关的一些概念:
1.平衡vs. 非平衡:平衡二叉树中,每个节点的左右子树的深度相差至多
为1(1或0)。
2.满二叉树(Full Binary Tree):除叶子节点以为的每个节点都有两个孩子。
3.完美二叉树(Perfect Binary Tree):是具有下列性质的满二叉树:所有的
叶子节点都有相同的深度或处在同一层次,且每个父节点都必须有两个孩子。
4.完全二叉树(Complete Binary Tree):二叉树中,可能除了最后一个,每
一层都被完全填满,且所有节点都必须尽可能想左靠。
译者注:完美二叉树也隐约称为完全二叉树。完美二叉树的一个例子是一个人在给定深度的祖先图,因为每个人都一定有两个生父母。完全二叉树可以看成是可以有若干额外向左靠的叶子节点的完美二叉树。疑问:完美二叉树和满二叉树的
区别?(参考:/dads/HTML/perfectBinaryTree.html
4. 图
图相关的问题主要集中在深度优先搜索(depth first search)和广度优先搜索(breath first search)。
下面是一个简单的图广度优先搜索的实现。
1) 定义GraphNode
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19 class GraphNode{
int val;
GraphNode next;
GraphNode[] neighbors;
boolean visited;
GraphNode(int x) {
val = x;
}
GraphNode(int x, GraphNode[] n){ val = x;
neighbors = n;
}
public String toString(){
return "value: "+ this.val;
}
}
2) 定义一个队列Queue 1 class Queue{