设为首页 加入收藏

TOP

编程面试的10大算法概念汇总
2014-11-24 02:01:54 来源: 作者: 【 】 浏览:0
Tags:编程 面试 算法 概念 汇总

以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。


本文将从Java的角度看问题,包含下面的这些概念:


1. 字符串
2. 链表
3. 树
4. 图
5. 排序
6. 递归 vs. 迭代
7. 动态规划
8. 位操作
9. 概率问题
10. 排列组合




如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。


toCharArray()// 获得字符串对应的char数组
Arrays.sort() // 数组排序
Arrays.toString(char[] a)// 数组转成字符串
charAt(intx)// 获得某个索引处的字符
length()// 字符串长度
length// 数组大小


在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。


class Node {
int val;
Node next;

Node(int x) {
val = x;
next = null;
}
}


链表两个著名的应用是栈Stack和队列Queue。


栈:


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

public void push(Node n){
if(n != null){
n.next = top;
top = n;
}
}
}


队列:


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;
}else{
Node temp = new Node(first.val);
first = first.next;
return temp;
}
}
}


这里的树通常是指二叉树,每个节点都包含一个左孩子节点和右孩子节点,像下面这样:


class TreeNode{
int value;
TreeNode left;
TreeNode right;
}


下面是与树相关的一些概念:


译者注:完美二叉树也隐约称为完全二叉树。完美二叉树的一个例子是一个人在给定深度的祖先图,因为每个人都一定有两个生父母。完全二叉树可以看成是可以有若干额外向左靠的叶子节点的完美二叉树。疑问:完美二叉树和满二叉树的区别?(参考:http://xlinux.nist.gov/dads/HTML/perfectBinaryTree.html


图相关的问题主要集中在深度优先搜索(depth first search)和广度优先搜索(breath first search)。


下面是一个简单的图广度优先搜索的实现。


breath-first-search


1) 定义GraphNode


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


class Queue{
GraphNode first, last;

public void enqueue(GraphNode n){
if(first == null){
first = n;
last = first;
}else{
last.next = n;
last = n;
}
}

public GraphNode dequeue(){
if(first == null){
return null;
}else{
GraphNode temp = new GraphNode(first.val, first.neighbors);
first = first.next;
return temp;
}
}
}


3) 用队列Queue实现广度优先搜索


public class GraphTest {

public static void main(String[] args) {
GraphNode n1 = new GraphNode(1);
GraphNode n2 = new GraphNode(2);
GraphNode n3 = new GraphNode(3);
GraphNode n4 = new GraphNode(4);
GraphNode n5 = new GraphNode(5);

n1.neighbors = new GraphNode[]{n2,n3,n5};
n2.neighbors = new GraphNode[]{n1,n4};
n3.neighbors = new GraphNode[]{n1,n4,n5};
n4.neighbors = new GraphNode[]{n2,n3,n5};
n5.neighbors = new GraphNode[]{n1,n3,n4};

breathFirstSearch(n1, 5);
}

public static void breathFirstSearch(GraphNode root, int x){
if(root.val == x)
System.out.println("find in root");

Queue queue = new Queue();
root.visited = true;
queue.enqueue(root);

while(queue.first != null){
GraphNode c = (GraphNode) queue.dequeue();
for(GraphNode n: c.neighbors){

if(!n.visited){
System.out.print(n + " ");
n.visited = true;
if(n.val == x)
System.out.println("Find "+n);
queue.enqueue(n);
}
}
}
}
}


输出:


value: 2 value: 3 value: 5 Find value: 5
value: 4


下面是不同排序算法的时间复杂度,你可以去wiki看一下这些算法的基本思想。


另外,这里有一些实现/演示:: Counting sortMergesortQuicksortInsertionSort


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇单内核和微内核&Linux内核和传统U.. 下一篇shell 判断变量为数字的N种方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: