代码面试最常用的10大算法

25 篇文章 0 订阅

转载自:http://blog.csdn.net/u011225629/article/details/48320601

在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在面试的时候,很多公司都会让程序员编写一些算法实例,例如快速排序、二叉树查找等等。

本文总结了程序员在代码面试中最常遇到的10大算法类型,想要真正了解这些算法的原理,还需程序员们花些功夫。

1.String/Array/Matrix

在Java中,String是一个包含char数组和其它字段、方法的类。如果没有IDE自动完成代码,下面这个方法大家应该记住:     

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. toCharArray() //get char array of a String  
  2. Arrays.sort()  //sort an array  
  3. Arrays.toString(char[] a) //convert to string  
  4. charAt(int x) //get a char at the specific index  
  5. length() //string length  
  6. length //array size   
  7. substring(int beginIndex)   
  8. substring(int beginIndex, int endIndex)  
  9. Integer.valueOf()//string to integer  
  10. String.valueOf()/integer to string  
String/arrays很容易理解,但与它们有关的问题常常需要高级的算法去解决,例如动态编程、递归等。

下面列出一些需要高级算法才能解决的经典问题:

2.链表

在Java中实现链表是非常简单的,每个节点都有一个值,然后把它链接到下一个节点。     

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Node {  
  2.     int val;  
  3.     Node next;  
  4.    
  5.     Node(int x) {  
  6.         val = x;  
  7.         next = null;  
  8.     }  
  9. }  

比较流行的两个链表例子就是栈和队列。

栈(Stack)     

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Stack{  
  2.     Node top;   
  3.    
  4.     public Node peek(){  
  5.         if(top != null){  
  6.             return top;  
  7.         }  
  8.    
  9.         return null;  
  10.     }  
  11.    
  12.     public Node pop(){  
  13.         if(top == null){  
  14.             return null;  
  15.         }else{  
  16.             Node temp = new Node(top.val);  
  17.             top = top.next;  
  18.             return temp;      
  19.         }  
  20.     }  
  21.    
  22.     public void push(Node n){  
  23.         if(n != null){  
  24.             n.next = top;  
  25.             top = n;  
  26.         }  
  27.     }  
  28. }  
队列(Queue)

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

值得一提的是,Java标准库中已经包含一个叫做Stack的类,链表也可以作为一个队列使用(add()和remove())。(链表实现队列接口)如果你在面试过程中,需要用到栈或队列解决问题时,你可以直接使用它们。

在实际中,需要用到链表的算法有:

3.树&堆

这里的树通常是指二叉树。

class TreeNode{
	int value;
	TreeNode left;
	TreeNode right;
} 
下面是一些与二叉树有关的概念:

  • 二叉树搜索:对于所有节点,顺序是:left children <= current node <= right children;
  • 平衡vs.非平衡:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树;
  • 满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点;
  • 完美二叉树(Perfect Binary Tree):一个满二叉树,所有叶子都在同一个深度或同一级,并且每个父节点都有两个子节点;
  • 完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

堆(Heap)是一个基于树的数据结构,也可以称为优先队列(     PriorityQueue),在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。

下面列出一些基于二叉树和堆的算法:

 

本文借鉴:http://www.csdn.net/article/2014-04-10/2819237-Top-10-Algorithms-for-Coding-Interview(。。。。)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值