`
iwindyforest
  • 浏览: 235170 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

面试10大算法汇总+常见题目解答

阅读更多

面试10大算法汇总+常见题目解答

 

最近更新: 2013年12月15日 持续更新…

英文版的“面试10大算法汇总”日最高访问量已高达4,318次。这说明总结程序员面试算法有实际意义,比读算法书更有效。下面是中文版的10大算法汇总+有代表性的题目汇总。这些概念是专门为面试准备的,因为日常编程中我们很少会自己去写一个链表或者做一个图,也不会经常使用没有效率的递归。

以下用Java角度解释面试常见的算法和数据结构:字符串,链表,树,图,排序,递归 vs. 迭代,动态规划,位操作,概率问题,排列组合,以及一些需要寻找规律的题目。

1. 字符串和数组

首先需要注意的是和C++不同,Java字符串不是char数组。没有IDE代码自动补全功能,应该记住下面的这些常用的方法。

toCharArray() //获得字符串对应的char数组
Arrays.sort()  //数组排序
Arrays.toString(char[] a) //数组转成字符串
charAt(int x) //获得某个索引处的字符
length() //字符串长度
length //数组大小
substring(int beginIndex) 
substring(int beginIndex, int endIndex)
Integer.valueOf() //string to integer
String.valueOf() /integer to string

字符串和数组本身很简单,但是相关的题目需要更复杂的算法来解决。比如说动态规划,搜索,等等。

经典题目: Evaluate Reverse Polish Notation, Longest Palindromic Substring, Word Break, Word Ladder.

2. 链表

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

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

链表两个著名的应用是栈Stack和队列Queue。在Java标准库都都有实现,一个是Stack,另一个是LinkedList(Queue是它实现的接口)。

经典题目: Add Two Numbers, Reorder List, Linked List Cycle, Copy List with Random Pointer.

3. 树

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

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

下面是与树相关的一些概念:
二叉搜索树:左结点 <= 中结点 <= 右结点
平衡 vs. 非平衡:平衡二叉树中,每个节点的左右子树的深度相差至多为1(1或0)。
满二叉树(Full Binary Tree):除叶子节点以为的每个节点都有两个孩子。
完美二叉树(Perfect Binary Tree):是具有下列性质的满二叉树:所有的叶子节点都有相同的深度或处在同一层次,且每个父节点都必须有两个孩子。
完全二叉树(Complete Binary Tree):二叉树中,可能除了最后一个,每一层都被完全填满,且所有节点都必须尽可能想左靠。

经典题目:Binary Tree Preorder Traversal , Binary Tree Inorder Traversal, Binary Tree Postorder Traversal, Word Ladder.

4. 图

图相关的问题主要集中在深度优先搜索(depth first search)和广度优先搜索(breath first search)。深度优先搜索很简单,广度优先要注意使用queue. 下面是一个简单的用队列Queue实现广度优先搜索。

public class GraphTest {
	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);
				}
			}
		}
	}
}

经典题目:复制图(Clone Graph)

5. 排序

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

Algorithm Average Time Worst Time Space
冒泡排序(Bubble sort) n^2 n^2 1
选择排序(Selection sort) n^2 n^2 1
插入排序(Insertion sort) n^2 n^2  
快速排序(Quick sort) n log(n) n^2  
归并排序(Merge sort) n log(n) n log(n) depends

* 另外还有BinSort, RadixSort和CountSort 三种比较特殊的排序。

经典题目: Mergesort, Quicksort, InsertionSort.

6. 递归 vs. 迭代

对程序员来说,递归应该是一个与生俱来的思想(a built-in thought),可以通过一个简单的例子来说明。

问题:

有n步台阶,一次只能上1步或2步,共有多少种走法。

步骤1:找到走完前n步台阶和前n-1步台阶之间的关系。

为了走完n步台阶,只有两种方法:从n-1步台阶爬1步走到或从n-2步台阶处爬2步走到。如果f(n)是爬到第n步台阶的方法数,那么f(n) = f(n-1) + f(n-2)。

步骤2: 确保开始条件是正确的。

f(0) = 0;
f(1) = 1;

public static int f(int n){
	if(n <= 2) return n;
	int x = f(n-1) + f(n-2);
	return x;
}

递归方法的时间复杂度是指数级,因为有很多冗余的计算:

f(5)
f(4) + f(3)
f(3) + f(2) + f(2) + f(1)
f(2) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)
f(1) + f(0) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

直接的想法是将递归转换为迭代:

public static int f(int n) {
	if (n <= 2){
		return n;
	}
 
	int first = 1, second = 2;
	int third = 0;
	for (int i = 3; i <= n; i++) {
		third = first + second;
		first = second;
		second = third;
	}
	return third;
}

这个例子迭代花费的时间更少,你可能复习一个两者的区别Recursion vs Iteration

7. 动态规划

动态规划是解决下面这些性质类问题的技术:

  1. 一个问题可以通过更小子问题的解决方法来解决,或者说问题的最优解包含了其子问题的最优解
  2. 有些子问题的解可能需要计算多次
  3. 子问题的解存储在一张表格里,这样每个子问题只用计算一次
  4. 需要额外的空间以节省时间

爬台阶问题完全符合上面的四条性质,因此可以用动态规划法来解决。

public static int[] A = new int[100];
 
public static int f3(int n) {
	if (n <= 2)
		A[n]= n;
 
	if(A[n] > 0)
		return A[n];
	else
		A[n] = f3(n-1) + f3(n-2);//store results so only calculate once!
	return A[n];
}

8. 位操作

常用位操作符:

OR (|) AND (&) XOR (^) Left Shift (<<) Right Shift (>>) Not (~)
1|0=1 1&0=0 1^0=1 0010<<2=1000 1100>>2=0011 ~1=0

用一个题目来理解这些操作 -

获得给定数字n的第i位:(i从0计数并从右边开始)

public static boolean getBit(int num, int i){
	int result = num & (1<<i);
 
	if(result == 0){
		return false;
	}else{
		return true;
}

例如,获得数字10的第2位:

i=1, n=10
1<<1= 10
1010&10=10
10 is not 0, so return true;

9. 概率问题

解决概率相关的问题通常需要先分析问题,下面是一个这类问题的简单例子:

一个房间里有50个人,那么至少有两个人生日相同的概率是多少?(忽略闰年的事实,也就是一年365天)

计算某些事情的概率很多时候都可以转换成先计算其相对面。在这个例子里,我们可以计算所有人生日都互不相同的概率,也就是:365/365 * 364/365 * 363/365 * … * (365-49)/365,这样至少两个人生日相同的概率就是1 – 这个值。

public static double caculateProbability(int n){
	double x = 1; 
 
	for(int i=0; i<n; i++){
		x *=  (365.0-i)/365.0;
	}
 
	double pro = Math.round((1-x) * 100);
	return pro/100;
}
calculateProbability(50) = 0.97

10. 排列组合

组合和排列的区别在于次序是否关键。

11. 其他类型的题目

主要是不能归到上面10大类的。需要寻找规律,然后解决问题的。

经典题目: Reverse Integer

更新记录

算法汇总会不算更新,同时偶尔我会面试Google, Facebook, Amazon, Microsoft等等比较有名的公司,面经也会分享在这里。欢迎收藏本页。

微博:http://www.weibo.com/programcreek

12/06/2013 – 添加 “Add Two Numbers”, “Binary Tree Traversal(pre/in/post-order)”, “Find Single Number”,”Word Break”,”Reorder List”,”Edit Distance”, ” Reverse Integer”
12/14/2013 – 添加 “Copy List with Random Pointer”, “Evaluate Reverse Polish Notation”, “Word Ladder”.

引用:
1. Binary tree
2. Introduction to Dynamic Programming
3. UTSA Dynamic Programming slides
4. Birthday paradox
5. Cracking the Coding Interview: 150 Programming InterviewQuestions and Solutions, Gayle Laakmann McDowell
5. Counting sort
6. 感谢伯乐在线-敏敏翻译
7. Top 10 Algorithms for Coding Interview

 

Related posts:

  1. Leetcode Solution of Iterative Binary Tree Postorder Traversal in Java
  2. Leetcode Solution of Binary Tree Inorder Traversal in Java
  3. Top 10 Algorithms for Coding Interview
  4. Leetcode Solution for Binary Tree Preorder Traversal in Java
分享到:
评论

相关推荐

    面试十大算法汇总+常见题目解答.pdf

    面试十大算法汇总+常见题目解答.pdf

    机器学习+面试题目与解答+算法工程师+NLP工程师面试题目

    本篇文档重点描述了机器学习面试中常会用到的机器学习知识点,内容为个人博客的汇总,为了方便大家能够快速地搜索到相关知识点,特意汇总成word文档,其中共13个章节,61页内容,近三万字;分别为模型篇、线性模型篇...

    常见面试算法题

    "常见面试算法题"这一主题涵盖了编程面试的核心部分,旨在帮助求职者准备这些关键的挑战。下面将详细讨论相关知识点。 1. **算法基础**:算法是解决问题的步骤集合,面试中常见的包括排序算法(如冒泡、选择、插入...

    常见C++面试题汇总(最全c语言面试题)

    常见C++面试题汇总(最全c语言面试题) 所包含文件: 1、华为C++内部培训材料 2、130道面试题.doc 3、C++试题.htm 4、C-C++ 程序设计员应聘常见面试试题深入剖析.mht 5、C语言面试题大汇总之华为面试题.txt 6、C语言...

    CC++笔试、面试题目大汇总

    "CC++笔试、面试题目大汇总"这个资源是针对那些希望在C++相关职位中寻找工作的求职者或者想要深入学习C++的开发者们的重要参考资料。下面,我们将详细探讨这个主题中的关键知识点。 1. **基础知识**:C++的基础包括...

    百度面试算法题汇总

    本资源“百度面试算法题汇总”旨在为面试者提供一系列的算法题目和解决方案,帮助他们提升在面试中的表现。下面将详细探讨这些算法题目涉及的知识点,并给出相应的解题思路。 首先,面试中常见的算法题型包括但不...

    C++ 面试真题汇总和解答

    这份"C++面试真题汇总和解答"提供了全面的面试问题及答案,旨在帮助你更好地理解C++的关键概念,提升你的面试竞争力。以下是一些可能涵盖的重要知识点: 1. **基本语法**:包括变量声明、类型转换、运算符优先级、...

    面试常用C考题汇总+几个公司考题实例

    除了理论知识,通过阅读和分析《C语言面试题大汇总.docx》等文档,你可以看到实际面试中可能遇到的问题,比如链表操作、递归问题、内存管理题目等。同时,通过《c++面试题 - 逆水行舟 - C++博客.mht》等资料,你可以...

    嵌入式软件笔试面试题目大汇总.zip

    本资料包“嵌入式软件笔试面试题目大汇总.zip”包含了丰富的面试和笔试资源,旨在帮助求职者更好地准备相关面试。 首先,我们要关注的是“进程与线程”的概念。进程是操作系统中运行程序的实例,而线程则是进程中...

    C++面试题笔试题C++ 数据结构算法笔试题资料合集.zip

    C++面试题笔试题C++ 数据结构...CC++面试问题分类大汇总.docx C_C++笔试题大全.doc gamesloft C++面试题目.docx 常见C++笔试题目整理(含答案).docx 经典C++面试题.docx 近期出现的C++面试题整理(附详细答案).docx

    面试技巧汇总,面试常见题目和技巧

    对于技术面试,准备一些常见的编程题和算法是必要的。例如,理解并能熟练应用数据结构(如数组、链表、树等)和排序算法(如冒泡、选择、插入、快速排序等)。同时,熟悉常用的编程语言,如Java、Python、C++等,...

    非常有用的101道算法部分常见面试题(面试题目荟萃)

    常见算法面试题汇总 以下是对给定文件信息的知识点总结: 问题1: cake 分割 如何将一个矩形蛋糕(或立方体)分割成两个相等的部分,假设已经有一块矩形蛋糕被移除?这道题考验了候选人的问题分析和解决能力。 ...

    2021最新面试经验,包括百度、阿里、美团、字节跳动算法面试题总结经验

    这份2021年的面试经验汇总,涵盖了百度、阿里、美团、字节跳动等知名互联网企业的算法面试题目,对求职者来说具有极高的参考价值。 一、百度面试题 百度作为国内搜索引擎巨头,其算法面试题往往注重实际问题的解决...

    C语言面试题大汇总 题目和解答

    根据给定文件的信息,我们可以总结出以下详细的IT知识点: ### C语言面试题知识点解析 #### 1....通过上述知识点的详细解析,我们可以更深入地理解C语言中的一些基本概念和面试中常见的技术问题。

    算法面试题总结.pdf

    本资源汇总了五道常见的算法面试题,并提供了详细的解答。这些题目涵盖了数据结构、算法设计和问题解决等方面,旨在帮助读者更好地理解和掌握算法设计的基本原理和方法。 一、把二元查找树转换成排序的双向链表 这...

    最新版--Java+最常见的+200++面试题汇总+答案总结汇总.pdf

    Java 面试题汇总 在这篇文章中,我们将总结了 Java 面试中的 200 多个问题,涵盖了 Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、...

    大前端面试题内容,包括vue,JavaScript,CSS,html,node,算法,面试题目遇到问题整理等其他汇总

    "FrontEndInterView-main"这个文件名可能是面试题目的主要目录,可能包含各个主题的详细题目和解答,对于复习和准备面试非常有帮助。建议根据这些分类进行系统性学习,结合实际项目经验,提升自己的技术水平,以应对...

    C语言-面试题目-汇总

    在C语言面试中,面试官通常会通过一系列题目来评估应聘者的编程能力、逻辑思维以及对C语言基础知识的掌握程度。以下是一些常见的C语言面试题及其解析: 1. **约瑟夫问题** (难度:3):这是一个经典的循环数组问题,...

    微软等数据结构算法面试100题答案集锦

    综上所述,《微软等数据结构算法面试100题答案集锦》不仅提供了具体的题目和解答,更重要的是它可以帮助读者系统地复习数据结构与算法的相关知识,提升解决问题的能力,为参加大型IT公司的面试做好充分准备。

Global site tag (gtag.js) - Google Analytics