面试题系列
文章平均质量分 78
石锅拌饭
新的博客在简书更新,欢迎阅读指正。
展开
-
中缀表达式转换为后缀表达式
一、后缀表达式求值后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为:6 5 2 3 + 8 * + 3 + *,则其求值过程如下:1)遍历表达式,遇到的数字首先放入栈中,此时栈如下所示:2)接着读到“+”,则弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中。3)读到8,将其直接放入栈中。4)读到“*”,弹出8和原创 2012-09-20 21:34:02 · 175810 阅读 · 84 评论 -
完全二叉树的判定
问题描述判定一棵二叉树是否是完全二叉树。二叉树定义如下:struct node { int data; struct node* left; struct node* right; }; typedef struct node BinaryTree;完全二叉树的定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的原创 2012-10-05 23:08:41 · 2354 阅读 · 0 评论 -
二叉树中节点的最大距离
《编程之美: 求二叉树中节点的最大距离》的另一个解法原文地址:http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟来的书评和感想──给喜爱编程的朋友》。书评就不转载到这里了,取而代之,在这里介绍书里其中一条问题的另一个解法。这个解法比较简短易读及降低了空间复转载 2012-10-05 20:03:37 · 2077 阅读 · 0 评论 -
比特位操作算法题汇总
涉及比特位操作的算法题有很多,本文对其中常见的一些进行汇总,所有资源来自网络。一、判断一个正整数是否是2的整数次幂判断一个整数N是否是2的整数次幂,这是个很常见的问题。比如4、8等都是2的整数次幂,而6不是。解法1)一个基本的解法是设定i=1开始,循环乘以2直到i>=n,然后判断i是否等于n即可。解法2)当然还有一个更好的方法,那就是观察一个数字的二进制表示,如n=101000,则原创 2012-10-04 17:14:36 · 6151 阅读 · 7 评论 -
出栈数目
题目描述已知一个入栈序列,试求出所有可能的出栈序列数目。例如入栈序列为1,2,3,则可能的出栈序列有5种:1 2 3,1 3 2 ,2 1 3,2 3 1,3 2 1。 分析要求解出栈序列的数目,还算比较容易的。已经有很多文章分析过这个问题,最终答案就是卡特兰数,也就是说n个元素的出栈序列的总数目=C(2n, n) - C(2n, n-1) = C(2n, n) / (n+1)原创 2012-10-05 12:42:49 · 2530 阅读 · 2 评论 -
最大的二阶子矩阵
转载自http://blog.csdn.net/zhanxinhang,作者:花心龟的扮演者ZhanHang题:求一个矩阵中最大的二维子矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5转载 2012-10-03 15:30:20 · 2188 阅读 · 0 评论 -
最大连续子序列和
最大连续子序列和问题是个很老的面试题了,最佳的解法是O(N)复杂度,当然其中的一些小的地方还是有些值得注意的地方的。这里还是总结三种常见的解法,重点关注最后一种O(N)的解法即可。需要注意的是有些题目中的最大连续子序列和如果为负,则返回0;而本题目中的最大连续子序列和并不返回0,如果是全为负数,则返回最大的负数即可。问题描述求取数组中最大连续子序列和,例如给定数组为A={1, 3, -2,原创 2012-10-01 18:05:44 · 60517 阅读 · 23 评论 -
1的数目
题目描述给定一个十进制正整数N,求出从1到N的所有整数中包含1的个数。比如给定N=23,则包含1的个数为13。其中个位出现1的数字有1,11,21,共3个,十位出现1的数字有10,11...19共10个,所以总共包含1的个数为3+10 = 13个。 自然的解法最自然的想法莫过于直接遍历1到N,求出每个数中包含的1的个数,然后将这些个数相加就是总的1的个数。需要遍历N个数,每次计原创 2012-10-03 23:01:04 · 1438 阅读 · 0 评论 -
不要被阶乘吓倒
题目描述给定一个整数N,那么N的阶乘N!末尾有多少个0呢?(该题取自《编程之美》)分析求解如果N!= K*10^M,且K不能被10整除,则N!末尾有M个0。考虑N!可以进行质因数分解,N!= (2^X) * (3^Y) * (5^Z)..., 则由于10 = 2*5,所以0的个数只与X和Z相关,每一对2和5相乘得到一个10,所以0的个数M=min(X, Z),显然2出现的数目比原创 2012-10-03 19:19:05 · 1635 阅读 · 0 评论 -
正则表达式简易实现
正则表达式 虽然正则表达式在 U n i x/Linux程序设计环境里随处可见,但在其他的系统里使用得却没有这么广泛。一个正则表达式本身也是一个字符序列,它定义了一集能与之匹配的字符串。大部分字符只是简单地与相同字符匹配,例如正则表达式 a b c将匹配同样的字符序列,无论它出现在什么地方。在这里还有几个元字符(meta character),它们分别表示重复、成组或者位置。原创 2012-07-18 19:17:03 · 2379 阅读 · 0 评论 -
和为N的连续正整数序列
题目输入一个正整数数N,输出所有和为N连续正整数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。一种运用数学规律的解法假定有k个连续的正整数和为N,其中连续序列的第一个数为x,则有x+(x+1)+(x+2)+...+(x+k-1) = N。从而可以求得x = (N - k*(k-1)/2) / k。当x的原创 2012-09-11 15:10:57 · 4752 阅读 · 0 评论 -
最大滑动窗口
题目描述给定一个数组A[],有一个大小为w的滑动窗口,该滑动窗口从最左边滑到最后边。在该窗口中你只能看到w个数字,每次只能移动一个位置。我们的目的是找到每个窗口w个数字中的最大值,并将这些最大值存储在数组B中。例如数组A=[1 3 -1 -3 5 3 6 7], 窗口大小w为3。则窗口滑动过程如下所示:Window position Max---原创 2012-09-11 17:38:03 · 4761 阅读 · 1 评论 -
背包问题汇总
本文主要来源于《背包问题九讲》,我主要选择了比较简单的0-1背包问题和完全背包问题进行汇总,并加入了python代码实现,刚重装系统,手头没有C编译器,汗。一、背包问题概述 背包问题包括0-1背包问题、完全背包问题、部分背包问题等多种变种。其中,最简单的是部分背包问题,它可以采用贪心法来解决,而其他几种背包问题往往需要动态规划来求解。本文对几种背包问题进行总结,同时给原创 2012-08-26 15:38:54 · 3472 阅读 · 0 评论 -
复杂链表的复制
原文地址:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode{转载 2012-08-28 20:23:36 · 1188 阅读 · 0 评论 -
找出二叉树中最大的子树,且子树为二叉搜索树
题目找出二叉树中最大的子树,该子树为二叉搜索树。所谓最大的子树就是指结点数目最多的子树。分析该题目是要找出二叉树中最大的子树,该子树必须是二叉搜索树(BST)。子树的概念需要重点关注一下,以下面一棵二叉树为例 ____10____ / \ __5_ 15_ / \原创 2012-10-05 22:16:09 · 4057 阅读 · 0 评论 -
随机算法全面总结
随机算法涉及大量概率论知识,有时候难得去仔细看推导过程,当然能够完全了解推导的过程自然是有好处的,如果不了解推导过程,至少记住结论也是必要的。本文总结最常见的一些随机算法的题目,也当作面试的准备工作吧。需要说明的是,这里用到的随机函数都假定它能随机的产生范围[a,b]内的整数,即产生每个整数的概率相等。(虽然在实际中并不一定能实现,不过,谁在乎呢?这个世界都是这么随机)一、随机排列数组原创 2012-08-29 16:21:27 · 17309 阅读 · 0 评论 -
杨氏矩阵搜索算法
问题:已知一个2维矩阵,其中的元素每一行从左至右依次增加,每一列从上到下依次增加。即对于矩阵Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我们也称这样的矩阵为杨氏矩阵。给出判定某个数是否存在该矩阵中的高效算法。 分析:为了便于复杂度分析,我们暂时假定该矩阵为大小n*n。如下图所示为一个杨氏矩阵。原创 2012-07-13 22:02:51 · 14972 阅读 · 12 评论 -
正则表达式基础
正则表达式基础正则表达式工作中会经常用到,只是很少去系统的总结其中的一些基础的东西,导致有时候容易疏忽,上次修复一个url跳转的漏洞就考虑的简单,写错了正则,所以还是写篇文章来系统总结一下。正则表达式所有的编程语言几乎都是支持的,用于处理字符串匹配。大概流程就是根据正则表达式模式字符串,然后根据模式去匹配文本。记得我很久之前还写过一篇写正则匹配算法的文章正则表达式简易实现,有兴趣的可以看看原创 2014-11-23 17:36:20 · 2220 阅读 · 0 评论 -
中序遍历和先序遍历/后序遍历构建二叉树
1、问题给定二叉树的2个遍历序列(如先序+中序,先序+后序,中序+后序等),是否能够根据这2个遍历序列唯一确定二叉树?2、理论分析数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树。然后就是根据二叉树的不同遍历序列(先序、中序、后序),重构二叉树。显然,这三种组合并不是都能唯一确定二叉树的,其原创 2012-07-25 15:02:23 · 29486 阅读 · 13 评论 -
twitter面试题之装水问题
据说这是twitter的一个面试题,不过,去年找工作的时候我的一个同学在面试微软的时候也有问到这个问题。很有意思的一个题目,当时我也没有去深究到底怎么实现比较好,前几天在伯乐在线上面看到了这篇文章面试题分析:我的Twitter技术面试失败了, 才知道这个解法原来很简单,只是刚开始没怎么看懂,比较绕。好吧,废话少说,我还是根据自己的理解来说下这个问题,不对之处,还请大家指正。题目描述:原创 2013-11-09 20:28:17 · 3499 阅读 · 3 评论 -
最大连续子序列乘积
问题描述给定一个整数序列(可能有正数,0和负数),求它的一个最大连续子序列乘积。比如给定数组a={3, -4, -5, 6, -2},则最大连续子序列乘积为720,即3*(-4)*(-5)*6=720。分析求最大连续子序列乘积与最大连续子序列和问题有所不同,因为其中有正有负还有可能有0。假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来原创 2012-10-01 22:27:12 · 7762 阅读 · 9 评论 -
链表模拟加法问题
题目描述给定两个链表,每个链表的结点值为数字的各位上的数字,试求出两个链表所表示数字的和,并将结果以链表形式返回。链表的结点定义如下:typedef struct node *pNode;struct node{ int data; struct node *next;};题目有点拗口,请看一个例子:假定两个链表分别为list1和list2,list1各个结点值分别为原创 2012-09-14 11:36:04 · 1757 阅读 · 2 评论 -
判定两棵二叉树是否同构
题目描述给定两棵二叉树,根结点为t1和t2,判定这两棵二叉树是否同构。所谓二叉树同构就是指它们的结构相同。 分析为了判定是否同构,可以考虑递归来解决。代码比较简单,如下所示bool isomorphism(Node* t1, Node* t2){ if(NULL == t1 || NULL == t2) return (NULL == t1) &&原创 2012-10-13 21:03:15 · 5355 阅读 · 1 评论 -
二叉树两结点的最低公共祖先结点(一)
题目二叉树结点的定义如下:struct node { int data; struct node* left; struct node* right;};给定二叉树中的两个结点,输出这两个结点的最低公共祖先结点(LCA)。注意,该二叉树不一定是二叉搜索树。比如给定的二叉树如下所示,则可以知道结点1和5的最低公共祖先结点为5,结点4和5的最低公共祖先原创 2012-09-02 23:01:42 · 11505 阅读 · 4 评论 -
给定一个字符数组,存储有R、G、B字符,将所有字符按照RGB顺序排序
这个题目隐约是在某个博客上看到过,后来书签掉了,一直找不到原文,所以只好自己写了一个解法,但愿没有出错。题目描述已知一个字符数组,其中存储有R、G、B字符,要求将所有的字符按照RGB的顺序进行排序。比如给定一个数组为char s[] = "RGBBRGGBGB",则排序后应该为RRGGGGBBBB。 分析解法1)这个题目有点类似于快速排序中用到的划分数组的方法,但是这里有三个字原创 2012-10-04 21:46:18 · 4649 阅读 · 2 评论 -
字符串函数汇总
面试中常常会要求写一些基本的库函数,尤其以字符串库函数考的最多,所以本文汇总了一些常见的字符串库函数的实现。此外,把与内存相关的操作函数也汇总到了一起。//求字符串长度int strlen(const char *s) { int n = 0; while (*s++ != '\0') n++; return n;}//字符串拷贝,返回指针是为了实现链式操原创 2012-08-15 10:56:19 · 1402 阅读 · 1 评论 -
设计包含min函数的栈
题目:设计一个栈,使得PUSH、POP以及GetMin(获取栈中最小元素)能够在常数时间内完成。 分析:很刚开始很容易想到一个方法,那就是额外建立一个最小堆保存所有元素,这样每次获取最小元素只需要O(1)的时间。但是这样的话,PUSH和POP操作就需要O(lgn)的时间了(假定栈中元素个数为n),不符合题目的要求。那么用1个辅助栈如何呢?解法:使用一个辅助栈来保存最...原创 2012-07-16 20:45:22 · 7834 阅读 · 0 评论 -
素数算法
题目:写一个程序,找出前N个素数。比如N为100,则找出前100个素数。分析最基本的想法就是对1到N得每个数进行判断,如果是素数则输出。一种改进的方法是不需要对1到N所有的数都进行判断,因为偶数肯定不是素数,而奇数可能是素数,可能不是。2,3,5都是素数,这可以直接得到。然后我们可以跳过2与3的倍数,即对于6n,6n+1, 6n+2, 6n+3, 6n+4, 6n+5,我们只需原创 2012-08-13 15:15:20 · 2398 阅读 · 0 评论 -
最长回文子串
题目描述给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长回文子串为abba。一个容易犯的错误初看这个问题可能想到这样的方法:对字符串S逆序得到新的字符串S',再求S和S'的最长公共子串,这样求出的就是最长回文子串。如S="caba原创 2012-09-17 15:36:53 · 7580 阅读 · 12 评论 -
二叉树问题汇总(2)—常见问题
在上一篇二叉树问题汇总(1)中总结了下二叉树的一些基本问题,主要是针对二叉排序树。这篇文章主要汇总二叉树的一些常见的但是难度稍大一点的问题。1、判定二叉树是否存在和为给定值的路径问题:给定一个值,判定二叉树是否存在从根结点到叶结点的路径,其结点的数据之和为该值。比如二叉树如下所示,给定的和为27:则二叉树存在的根结点到叶结点的路径有:path 1: 5 4 11 7原创 2012-07-19 21:43:49 · 2170 阅读 · 0 评论 -
二叉树遍历之非递归算法
在前一篇文章二叉树遍历递归算法对二叉树遍历的递归算法做了总结,这篇文章就来对二叉树遍历的非递归算法做个汇总。还是与上一篇文章一样的顺序,一一汇总先序、中序、后序以及层序遍历的非递归算法。1、先序遍历(非递归算法)先序遍历非递归访问,使用栈即可实现。先序遍历的非递归访问在所有的遍历中算是最简单的了。主要思想就是先将根结点压入栈,然后根结点出栈并访问根结点,而后依次将根结点的右孩子、左原创 2012-07-22 22:30:26 · 33647 阅读 · 21 评论 -
二叉树遍历之递归算法
二叉树的遍历算法有多种,典型的有先序遍历、中序遍历、后序遍历以及层序遍历。而且这些遍历的递归算法较为简单,代码很少,容易实现,本文就是汇总二叉树遍历的递归算法,非递归算法将在下一篇文章中进行总结。本文中用到的二叉树实例如下: 3 / \ 9 20 / \ 15 7二叉树定义和辅助函数如下:struct node {原创 2012-07-22 19:31:35 · 13314 阅读 · 3 评论 -
链表复制算法
问题已知一个简单链表,请复制链表并返回头结点指针。解法1:遍历算法从头开始遍历原链表,依次复制链表各个节点。结点定义如下:struct node { int data; struct node* next;};typedef struct node* pNode;创建新结点newNode代码:pNode newNode(int data)原创 2012-07-18 20:26:57 · 6736 阅读 · 0 评论 -
有序的循环链表中插入结点
题目给定一个有序的循环链表,在其中插入一个值,保持该循环链表依然有序。分析首先看下循环链表的结构,如下图所示为一个循环链表,其尾结点指向头结点,从而形成一个循环。给定的链表结点可以是链表任意一个结点,这个结点不一定是链表头结点,从而这也增加了该题的难度。此时若是要在链表中插入4,则插入后的链表如下所示:可以看到插入4后,链表依然有序。在解决这个问题前,先来看一个原创 2012-08-17 21:43:37 · 3869 阅读 · 0 评论 -
链表逆序算法
问题:给定一个链表,请将其逆序。即如果链表原来为1->2->3->4->5->null,逆序后为5->4->3->2->1->null.解法1:迭代算法迭代算法效率较高,但是代码比递归算法略长。递归算法虽然代码量更少,但是难度也稍大,不细心容易写错。迭代算法的思想就是遍历链表,改变链表节点next指向,遍历完成,链表逆序也就完成了。代码如下:struct node {原创 2012-07-17 10:20:36 · 7209 阅读 · 0 评论 -
输出链表倒数第K个结点
题目描述:输入一个单向链表,输出该链表中倒数第k个结点。分析:方法1:要输出链表中的倒数第K个结点,最自然的想法是先求出链表的长度N,然后从头遍历链表输出链表的第N-K+1个结点即可。注意本题数字从1计数,也就是说倒数第1个节点是链表最后一个结点。例如链表长度为4,需要输出倒数第2个结点,则我们只需要从头开始输出链表第3个结点即可。该思路代码如下:struct node原创 2012-08-17 15:26:43 · 4800 阅读 · 10 评论 -
腾讯的一道面试题—不用除法求数字乘积
题目:已知一个包含N个元素的数组A[N],试求出这样一个数组OUTPUT[N],其中OUTPUT[I]的值为数组A中除了A[i]的其他所有元素的乘积。注意,不能使用除法。时间复杂度必须为O(N)。例如OUTPUT[0]的值为A[1]*A[2]...A[N], OUTPUT[1]的值为A[0]*A[2]...A[N]。假定数组A={4, 3, 2, 1, 2},则OUTPUT={12,原创 2012-07-31 21:26:38 · 4049 阅读 · 3 评论 -
经典shell面试题整理
一、取出/etc/passwd文件中shell出现的次数问题:下面是一个/etc/passwd文件的部分内容。题目要求取出shell并统计次数,shell是指后面的/bin/bash,/sbin/nologin等,如下面/bin/bash出现12次,/sbin/nologin出现3次。hyn:x:525:500::/home/hyn:/bin/bashljlxx:x:526:500::/原创 2012-07-31 16:03:21 · 12862 阅读 · 5 评论 -
整数分解使得积最大
题目:给一个数n,你可以将这个数拆成任意个整数之和。找出在所有的拆分方式中,拆出来的所有的数的积的最大值(也包括只拆成一个数,如2拆成2最大)。如 n = 6, 可以拆成 3 * 3 = 9 2 * 4 = 82 * 2 * 2 = 8 1 * 1 * 4 = 41 * 1 * 2 * 2 = 4 ...最大值为9。分原创 2012-08-14 19:16:25 · 2462 阅读 · 0 评论 -
java多线程环境单例模式实现详解
Abstract 在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制,也就是说只有当使用到这个实例的时候才会创建这个实例,这个好处在单例模式中得到了广泛应用。这个机制在single-threaded环境下的实现非常简单,然而在multi-threaded环境下却存在隐患。本文重点介绍惰性加载机制以及其在多线程环境下的使用方法。(作者number转载 2012-08-14 11:41:10 · 1133 阅读 · 0 评论