面试算法
OS技术解密
阿里巴巴
展开
-
0-1背包问题
题目描述:有n件物品和一个容量为v的背包。第i件物品的重量是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值和最大。算法分析:动态规划的题目一直是比较有难度,这种题目炸看往往连个思路都没有,往往需要数组记录信息来降低复杂度。解题的关键是找出状态转移方程。假设f[i][v]表示前i件物品恰放入一个容量为v的背包所能取得的最大值。如果我们选取第i原创 2014-04-15 21:09:42 · 1475 阅读 · 0 评论 -
面试经典(21)--最大回文
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。解法:pChar指向当前字符,比如第一个‘o',那么以pChar为中心向俩边判定。要分奇数偶数俩种情况,由于要遍历n个字符,且最多向两边扩展长度为n,所以复杂度O(n^2)。int GetLongestSymmetricalLength_原创 2014-04-20 17:05:03 · 962 阅读 · 0 评论 -
面试经典(1)---翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次原创 2014-04-19 21:21:09 · 1317 阅读 · 0 评论 -
面试经典(2)---删除特定字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:我们考虑如何在字符串中删除一个字符。由于字符串的内存分配方式是连续分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节的位置。但如果每次删除都需要移动字符串后面的原创 2014-04-19 20:29:25 · 896 阅读 · 0 评论 -
面试经典(3)---链表倒数第k个节点
题目:单链表,返回倒数第k个节点的指针分析:这道题目思路不难,但是题目不能说简单,如果现场面试写这个题目,我相信有很多人会达不到面试官的要求。if(pAhead->m_pNext!=NULL)判定条件比较重要。不能写成if(pAhead)。既然还能进入循环,说明还要将指针指向下一个节点,但是如果当前节点已经是最后一个节点,就要返回NULL。原创 2014-04-19 17:28:28 · 866 阅读 · 0 评论 -
面试经典(4)--链表逆序
题目:输入单链表的头结点,反转链表并输出反转之后的头结点。pNode代表当前节点,修改pNode的时候,要知道他的前面节点,并保存后面节点,因为一旦pNode->next被修改,就和后边断开。ListNode* reverse(ListNode *phead){ ListNode *pReversedHead=NULL; ListNode *pNode=phead; Lis原创 2014-04-19 16:23:09 · 875 阅读 · 0 评论 -
面试经典(5)--二叉树最低公共祖先LCA
题目:输入二叉树的俩个节点,求它们的最低公共祖先算法分析:我们直接来分析O(n)的算法。比如求节点F和节点H的最低公共祖先,先求出从根节点A到F的路径,再求出A到H的路径,那么最后一个相同的节点就是最低公共祖先。A->B->D->F和A->B->E->H,最后相同的节点事B,所以最低公共祖先是B节点。求根节点到指定节点的算法先前已经更新过了,复杂度是O(n),所以总的时间复杂度是O原创 2014-04-19 11:03:41 · 1964 阅读 · 0 评论 -
面试经典(9)--求数组的逆序对
题目描述: 数组中如果前面一个数字大于后面的数字,则这俩个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。面试直接让写归并排序感觉有点傻,还是考察归并排序迁移能力的题目比较好。算法分析:首先最先想到的顺序扫描整个数组,这样的复杂度是o(n2),没什么思维含量。我们先退一步抽象出另外一个问题,假设有个长度为n的数组A,前面n/2个元素是有序的,后面的n/2也是有序的,能不能在原创 2014-04-16 20:33:44 · 1251 阅读 · 0 评论 -
面试经典(17)--二叉树中和为某一值的路径
题目描述:输入一棵二叉树和一个整数,打印出二叉树中节点值原创 2014-04-10 09:21:10 · 3537 阅读 · 1 评论 -
面试经典(23)--圆圈中剩下的最后数字
题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里面删除第m个数字。求这个圆圈里剩下的最后一个数字。解法1:数组模拟使用数组来模拟的话空间复杂度和时间复杂度都会比较高,不过为了锻炼下逻辑思维,我们先使用数组。将长度为n的数组初始化0,变量count表示当前退出的人数,只要count=n-1就可以完成任务。t表示报数计数,当t=m时就将数组当前i位置元素置1,表原创 2014-04-21 20:05:20 · 1063 阅读 · 0 评论 -
面试经典(24)--二叉搜索树和双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。原创 2014-04-21 20:54:58 · 905 阅读 · 0 评论 -
面试经典(25)--二叉查找树(搜索树)
二叉搜索树是经典的数据结构,本文来总结一下二叉搜索树的插入和删除算法。插入算法:struct Node{ int key; struct Node *parent; struct Node *left; struct Node *right;};struct Node* tree_insert(struct Node *root,struct Node *newNode)原创 2014-04-21 21:40:15 · 1054 阅读 · 0 评论 -
面试经典(20)--数对之差的最大值
题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。原创 2014-04-20 10:46:57 · 1269 阅读 · 0 评论 -
面试经典(13)--二叉树非递归遍历
1.中序遍历中序遍历的思路分析:原创 2014-04-11 10:16:57 · 1166 阅读 · 0 评论 -
面试经典(6)--连续子数组最大和--二维
前面写了一篇一维数组求连续子数组最大和http://blog.csdn.net/getnextwindow/article/details/23958529。二维的情况会复杂很多会巧妙的借用一维的算法。如果暴力解法,复杂度明显不尽如人意,因为求和的过程中,有很多冗余情况,所以我们可以考虑将前面求和的结果保存下来,以空间换时间,这样可以降低复杂的。设PS[i][j]是以(i,j),(1,j),(原创 2014-04-19 08:58:24 · 1371 阅读 · 0 评论 -
面试经典(12)--射击打靶问题
题目描述:一个射击运动员打靶,靶一共有10环,连开10 枪打中90环的可能性有多少?原创 2014-04-12 22:44:47 · 2167 阅读 · 0 评论 -
面试经典(19)--求二叉树中节点的最大距离
本题目来自编程之美3.8原创 2014-04-08 22:51:36 · 1046 阅读 · 0 评论 -
面试经典(15)--判定是否是平衡二叉树
题目描述:原创 2014-04-10 20:22:45 · 984 阅读 · 0 评论 -
面试经典(8)--树的子结构
题目描述:输入俩棵二叉树A和B,判定B是不是A的子结构 1 8 / \ / \ 8 7原创 2014-04-17 11:24:39 · 1206 阅读 · 0 评论 -
面试经典(7)--连续子数组的最大值
题目:输入一个整型数组,数组有整数也有负数,求其子数组的最大值。算法分析:微软经典的一道题目。维持一个当前累加的和curSum,如果curSum0,那么只需继续累加data[i],每次更改curSum需要判定当前和是否大于最大的和maxSum,如果大于那么更新maxSum。bool invalid=false;int MaxSumOfSubArray(int *data,int len)原创 2014-04-17 21:14:22 · 1335 阅读 · 0 评论 -
面试经典(11)--二叉树层次遍历
题目描述:原创 2014-04-13 22:27:42 · 1127 阅读 · 0 评论 -
面试经典(16)--二叉树根节点到指定节点的路径
题目描述:给定yike原创 2014-04-10 10:19:07 · 8147 阅读 · 0 评论 -
面试经典(10)--归并排序
归并排序是面试常考的排序算法,也有一些题目是归并排序的变形,比如数组的逆序对问题,后面我会更新这个算法。归并是典型的分治算法,比较简单,直接上代码。void merge(int *a,int first,int mid,int last,int *temp){ int i=first,j=mid+1; int k=0; while(i<=mid && j<=last) { if(原创 2014-04-15 22:47:29 · 1520 阅读 · 0 评论 -
面试经典(14)--二叉树镜像
题目描述:输入一个二叉树,输出原创 2014-04-10 21:20:28 · 892 阅读 · 0 评论 -
面试经典(22)---字符串组合
题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;而是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字原创 2014-04-20 23:10:21 · 1079 阅读 · 0 评论 -
面试经典(18)--重建二叉树
题目描述:原创 2014-04-09 16:03:38 · 917 阅读 · 0 评论