程序员面试金典
文章平均质量分 61
天地一扁舟
这个作者很懒,什么都没留下…
展开
-
程序员面试金典: 9.3栈与队列 3.1描述如何只用一个数组来实现三个栈
#include #include #include #include using namespace std;/*问题:描述如何只用一个数组实现三个栈分析:栈是后进先出,先把问题简化为如何用一个数组实现一个栈 数组每次插入时插入在最后,取出时取出最后一个元素即可 暂未想到。难道对数组三等分,每个生成一个栈?书上解法:1 将栈三等分,维持一个数组,数组中每个原创 2016-12-22 10:19:03 · 529 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.6找出二叉查找树指定结点的下一个结点
#include #include #include#include using namespace std;/*问题:设计一个算法,找出二叉查找树中指定结点的下一个结点(也即中序后继)。可以假定每个结点都含有指向父节点 的连接。是否解出:否分析:二叉查找树是,左子树结点值<=结点值<右子树结点值。 中序遍历是: 根左右。显然不符合它的要求。找到结点,肯原创 2017-01-02 13:07:30 · 373 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.7找出二叉树种某两个结点的第一个共同祖先---O(N^2)解法
#include #include #include #include using namespace std;/*问题:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点储存在另外的数据结构中。 注意:这不一定是二叉查找树。分析:一种方式是根据结点,向上遍历,得到从当前结点到根节点的一个链表,设长链表的长度为L1,设短链表的长度为L2,原创 2017-01-02 14:21:43 · 585 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.7找出二叉树种某两个结点的第一个共同祖先---O(N)解法
#include #include #include #include using namespace std;/*问题:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点储存在另外的数据结构中。 注意:这不一定是二叉查找树。是否解出:解出,但不是最优书上解法:设两个结点为p,q情况1:如果p,q在根节点的两侧,那么直接返回根节点(牛逼,原创 2017-01-02 15:38:11 · 951 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.8判断一棵树是否是另一棵树的子树
#include #include #include #include using namespace std;/*问题:你有两颗非常大的二叉树:T1,有几百万个结点;T2,有几百个结点。设计一个算法,判断T2是否为T2的子树。 如果T1有这么一个结点n,其子树与T2一模一样,则T2位T1的子树。也就是说,从结点n处把树砍断,得到的树 与T2完全相同。分析:题目原创 2017-01-02 17:54:36 · 416 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.9在二叉树中,打印结点数值总和等于给定值的所有路径
#include #include #include #include using namespace std;/*问题:给定一颗二叉树,其中每个结点都含有一个数值。设计一个算法,打印结点数值总和等于某个给定值的所有路径。 注意,路径不一定非得从二叉树的根节点或叶节点开始或结束。分析:如果采用暴力破解,对每个结点都去计算路径,判断路径结点值是否等于给定值,则时间复杂度原创 2017-01-02 19:56:50 · 576 阅读 · 0 评论 -
程序员面试金典: 9.5位操作5.1两个整数的位合并
#include #include #include #include #include //用于atoi函数using namespace std;/*问题:给定两个32位的证书N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第j位开始,到第i位结束(j>i)。 嘉定从j位得到i位足以容纳M,也即若M=10011,那么j和i之间至少可以容纳5原创 2017-01-03 11:50:42 · 308 阅读 · 0 评论 -
程序员面试金典: 9.3栈与队列 3.2设计一个栈,除pop与push方法,支持返回栈最小元素min方法,时间复杂度均为O(1)
#include #include #include #include using namespace std;/*问题:请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。 push,pop,min三个方法的时间复杂度为O(1)分析:能否再普通栈的基础上维持一个最小元素的值,获取最小值时就返回它。 关键是如何找到最小值下面的原创 2016-12-23 09:00:01 · 717 阅读 · 0 评论 -
程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示
#include #include #include #include using namespace std;/*问题:给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"分析:其实就是浮点数转二进制整数。十进制浮点数转二进制的规则是:将数字N乘2取整,如果计算结果R为1就退出,否原创 2017-01-03 12:22:37 · 535 阅读 · 0 评论 -
程序员面试金典: 9.3栈与队列 3.3设计一个栈,栈到一定高度就会另外建栈。
#include #include #include #include #include using namespace std;/*问题:设想有一堆盘子,堆太高可能会到倒下来。因此,在现实生活中,盘子堆到一定高度时,就会 另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成, 并且在前一个栈填满时新建一个原创 2016-12-23 10:23:18 · 395 阅读 · 0 评论 -
程序员面试金典: 9.3栈与队列 3.4汉诺塔问题
#include #include using namespace std;/*问题:汉诺塔问题。N个盘子按从小到大放在第一根柱子上。还有第二个和第三个柱子,请将 所有盘子从第一个柱子移动到第三个柱子上。分析:N个盘子:步骤1:需要将N-1个盘子,从第1个柱子拿到第2个柱子,步骤2:再从第1个柱子将最下面的盘子从第1个柱子拿到第3个柱子步骤3:将N-1个盘子从第2原创 2016-12-23 14:16:57 · 479 阅读 · 0 评论 -
程序员面试金典: 9.3栈与队列 3.5实现一个MyQueue类,该类用两个栈来实现一个队列
#include #include #include #include using namespace std;/*问题:实现一个MyQueue类,该类用两个栈来实现一个队列分析:设两个栈分别为栈1和栈2.栈1负责压入,栈2负责弹出。一个例子:假设压入1,2,3,然后弹出1,压入4,。模拟过程:栈1:321栈2:空然后需要弹出1,此时需要将栈1所有元素压入栈2,此原创 2016-12-23 15:02:04 · 808 阅读 · 0 评论 -
程序员面试金典: 9.5位操作 5.3给定正整数,找出与其二进制表示中1的个数相同、且大小最接近的两个数
#include #include #include #include #include #include using namespace std;/*问题:给定一个正整数,找出与其二进制表示中1的个数相同、且大小最接近的那两个数(一个略大,一个略小)分析:假设这个数是10011,来找规律。 寻找略小的数:应该是将最低位的1向右移动:如果该最低位的1不是在最后一原创 2017-01-03 16:16:14 · 988 阅读 · 0 评论 -
程序员面试金典: 9.2链表 2.7检查链表是否为回文
#include #include #include using namespace std;/*问题:编写一个函数,检查链表是否为回文分析:所谓回文,也就是对称。先找到中间位置处,然后将链表中元素放入栈中 然后从头结点往后,依次取出栈中元素进行比较输入:5(链表长度)1 2 3 2 151 2 3 2 341 2 2 141 2 2 3输出:y原创 2016-12-21 17:24:51 · 406 阅读 · 0 评论 -
程序员面试金典: 9.2链表 2.6给定有环链表,实现算法返回环路的开头节点
#include #include using namespace std;/*问题:给定一个有环链表,实现一个算法返回环路的开头节点分析:快慢指针,一个每次走一步,一个每次走两步,如果能够相遇,必定存在环 现在关键是如何找到环路初始节点未解决:关键是要寻找相遇点y,环起始点x,环的长度L 三者之间的关系,目前关系忘了书上分析:设头结点距离环的起始点距离为L,设从环原创 2016-12-21 17:00:16 · 502 阅读 · 0 评论 -
程序员面试金典: 9.2链表 2.5对两个用链表表示的整数求和
#include #include using namespace std;const int MAXSIZE = 1000;/*问题:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是 个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。分析:比如两个数分别是123,789,由于个位在首部,得到如下的两个数 3 2原创 2016-12-21 15:02:28 · 817 阅读 · 0 评论 -
程序员面试金典: 9.2链表 2.4以给定值x为基准将链表分割成两部分
#include #include using namespace std;/*问题:以给定值x为基准将链表分隔成两部分,所有小于x的结点排在大于或等于x的结点之前分析:本质上是一个划分,可以采用前后两个指针,一个从前向后,一个从后向前 从前向后的,如果碰到前面小于x,则继续向后,否则令枢轴元素等于当前元素 从后向前,如果当前值大于x,则继续向前,否则令枢轴元素原创 2016-12-21 12:33:41 · 3062 阅读 · 0 评论 -
程序员面试金典: 9.5位操作 5.5编写一个函数,确定需要改变几个位,才能将整数A转成整数B
#include #include #include using namespace std;/*问题:编写一个函数,确定需要改变几个位,才能将整数A转成整数B。问题:这个好像记得需要用到 ( n & (n-1)) == 0。 找规律: A: 1011 , B:1101 , 那么需要变换两次, 将两个整数进行异或处理。 1011 1101异或: 0110原创 2017-01-03 21:44:13 · 533 阅读 · 0 评论 -
程序员面试金典: 9.5位操作 5.6交换某整数的奇数位和偶数位
#include #include using namespace std;/*问题:编写程序,交换某个整数的奇数位和偶数位,使用指令越少越好(也就是说,位0与位1交换,位2与位3交换,依此类推)分析:比如1011: 0111,也就是向前移动, 【注意最高位需要移动到最低位处,陷阱是:所看到的最高位可能不是正确的,需要分析 如果该整数为正整数,那么没有问题,直原创 2017-01-03 22:29:13 · 310 阅读 · 0 评论 -
程序员面试金典: 9.3栈与队列 3.6编写程序,按升序对栈进行排序(即最大元素位于栈顶)
#include #include #include #include using namespace std;/*问题:编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将 元素赋值到别的数据结构中(如数组)。该栈支持如下操作: push、pop、peek和isEmpty。分析:栈后进先出,但是需要对栈排序,而且允许使用原创 2016-12-24 10:23:31 · 1485 阅读 · 0 评论 -
程序员面试金典: 9.3栈与队列 3.7猫狗动物队列
#include #include #include #include using namespace std;/*问题:有家动物收容所只收容狗与猫,并且严格遵守“先进先出”原则。在收养该收容所的动物时,收养人只能收养所有动物中 “最老”(根据进入收容所的时间长短)的动物,或者,可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能 自由挑选原创 2016-12-24 12:37:58 · 1516 阅读 · 0 评论 -
程序员面试金典: 9.5位操作 5.7寻找丢失的整数
#include #include #include #include using namespace std;/*问题:数组A包含0到n的所有整数,但其中缺了一个。在这个问题中,只用一次操作无法取得数组A里某个整数的完整内容。 此外,数组A的元素皆以二进制表示,唯一可用的访问操作是“从A[i]取出第j位数据”,该操作的时间复杂度为长度。 请编写代码找出那个缺失的原创 2017-01-04 01:15:13 · 384 阅读 · 0 评论 -
程序员面试金典: 9.5位操作 5.8通过位操作进行两点连线
#include #include #include #include #include using namespace std;/*问题:有个单色屏幕存储在一个一维字节数组中,使得8个连续像素可以存放在一个字节里。屏幕宽度为w,且w可以被8整除(即一个字节不会分布在 两行上),屏幕宽度可由数组长度及屏幕宽度推算得出。请实现一个函数drawHorizontalLine原创 2017-01-04 13:18:52 · 343 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.2给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
#include #include #include #include using namespace std;/*问题:给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。分析:有向图,无非是没有顶点的树,需要考虑顶点和边。 图的两种创建方式:邻接矩阵,邻接表。 找出两个节点之间是否存在一条路径。Dijstra:两点之间最短路径,Flord是任意两点最原创 2016-12-27 15:38:40 · 3473 阅读 · 0 评论 -
程序员面试金典: 9.7位操作 7.3判定直角坐标系上两直线是否相交
#include #include #include using namespace std;/*问题:给定直角坐标系上的两条直线,确定这两条线会不会相交。分析:该问题有模糊地方,需要向面试官确认。 1、特殊情况:如果两条线是相同的,认为是相交的。 2、可以自己设计线的数据结构输入:3(第一条线的斜率) -2(第一条线的y轴截距) 3(第二条线的斜率) -原创 2017-01-04 23:55:19 · 439 阅读 · 0 评论 -
程序员面试金典: 9.7位操作 7.4只用加号实现整数的乘法、减法和除法运算
#include #include using namespace std;/*问题:编写方法,实现整数的乘法、减法和除法运算。只允许使用加号。分析:乘法比较简单,x*y等于将x连续累加y次,但要注意符号问题,若y为负数,最终结果需要取反 减法:x - y = x + (-y),最关键就是要对y取反。 取反的方法是: 如果y>0,那么令d=-1,sum=原创 2017-01-05 01:09:14 · 787 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。
#include #include using namespace std;/*问题:给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一颗高度最小的二叉查找树。分析:二叉查找树是左孩子<结点<右孩子。二叉查找树关键的部分应该是调整树的结点,使得平衡。高度最小 的二叉查找树,应该是平衡的二叉查找树。 中序遍历的结果是:左中右,那么遍历 问题转化为如何原创 2016-12-27 17:29:22 · 676 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。 ---快速解法
#include #include #include #include #include #include #include using namespace std;/*问题:给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一颗高度最小的二叉查找树。分析:二叉查找树是左孩子<结点<右孩子。二叉查找树关键的部分应该是调整树的结点,使得平衡。高度最小原创 2016-12-28 17:43:14 · 591 阅读 · 0 评论 -
程序员面试金典: 9.7数学与概率 7.5寻找能将将两个正方形对半分的直线
#include #include #include #include using namespace std;/*问题:在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分。假定正方形的上下两条边与x轴平行。分析:两个正方形的上下两条边都与x轴平行,那么这两个正方形平行。关键就是用直线对两个正方形进行平面平分处理。 首先,考虑如何对一个正方形进行面积原创 2017-01-05 18:53:07 · 360 阅读 · 0 评论 -
程序员面试金典: 9.7数学与概率 7.6在二维平面上,有一些点,请找出经过点最多的那条线
#include #include #include #include using namespace std;/*问题:在二维平面上,有一些点,请找出经过点数最多的那条线。分析:暴力破解,共有n(n-1)/2 条直线,对每个直线,判断剩余n-2个点是不是在直线上 总时间复杂度为O(n^3)。 可能需要排除某些线段,不是所有线段。 或者是求闭包,闭包问题记原创 2017-01-05 23:30:23 · 766 阅读 · 0 评论 -
程序员面试金典: 9.7数学与概率 7.7有些数的素因子只有3,5,7,请设计一个算法,找出其中第k个数
#include #include using namespace std;/*问题:有些数的素因子只有3,5,7,请设计一个算法,找出其中第k个数。分析:第k个数是指第k小的数吧?这个题目应该是剑指offer或编程之美中的丑数。 丑数的关键是寻找下一个丑数, 下一个丑数 = 在之前生成的丑数数组中寻找一个数 * (3或5或7),即大于当前丑数的最小值 设当前原创 2017-01-06 00:55:49 · 6286 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.4 在二叉树上创建包含某一深度上所有节点的链表
#include #include #include #include #include using namespace std;/*问题:给定一颗二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为D,则会创建出D个链表)。分析:题目的意思应该是深度为1的所有节点构成一个链表,深度为2的所有节点构成一个链表,....,也就是把 相同深度原创 2016-12-29 10:04:11 · 452 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.1实现一个函数检查二叉树是否平衡。
#include #include #include using namespace std;/*问题:实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两颗子树的高度差不超过1.分析:关于树的大部分问题都是和递归相关。 所以如果一棵树的左子树的高度和右子树各自平衡,且这两颗子树的高度之差不超过1即可。 递归基: isAVLT原创 2016-12-24 17:27:47 · 733 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.1实现一个函数检查二叉树是否平衡——O(N)时间解法
#include #include #include #include using namespace std;/*问题:实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两颗子树的高度差不超过1.分析:关于树的大部分问题都是和递归相关。 所以如果一棵树的左子树的高度和右子树各自平衡,且这两颗子树的高度之差不超过1即可。 递归基:原创 2016-12-27 10:13:25 · 417 阅读 · 0 评论 -
程序员面试金典: 9.4树与图 4.5实现一个函数,检查一颗二叉树是否为二叉查找树
#include #include #include using namespace std;/*问题:实现一个函数,检查一颗二叉树是否为二叉查找树分析:二叉查找树,其实就是左孩子<结点<右孩子 判断根节点是否满足二叉查找树特性,只需要判断左右子树是否满足。输入:6(树中结点个数n)4 2 6 1 3 5(树中结点的值,接下来有n行,每i行第一个字符:'d'表示原创 2016-12-29 10:33:41 · 414 阅读 · 0 评论 -
程序员面试金典: 9.1数组与字符串 3判断一个字符串字符重新排列后是否可变成另一个字符串
#include #include #include #include using namespace std;/*问题:给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串分析:字符串排列后的能否变成另一个字符串=对两个字符串排序,排序后比较若相同,则说明经过排列后 其中一个字符串可以变成另一个字符串 如果两个字符串不等,肯定不原创 2016-12-20 10:40:07 · 521 阅读 · 0 评论 -
程序员面试金典: 9.1数组与字符串 1判断字符串所有字符全都不同
#include #include #include using namespace std;const int MAXSIZE = 256;/*问题:实现算法,确定字符串所有字符是否全都不同思路:假设为ASCII字符,那么最多256个,如果字符串长度大于256,必定重复,如果<=256个字符,那么设定一个布尔数组,初始化该数组每个元素为否,表明没有重复出现,如果某字符首原创 2016-12-20 09:37:27 · 353 阅读 · 0 评论 -
程序员面试金典: 9.1数组与字符串 2写翻转字符串函数reverse(char* str)
#include #include using namespace std;const int MAXSIZE = 10000;/*问题:用C或C++实现void reverse(char* str)函数,即翻转一个null结尾的字符串分析:寻找到str最后的下标对应字符ch,然后从字符串末尾开始将最好的方法就是找到字符串的开始和末尾,将首尾交换后,然后向中间继续靠近输入:原创 2016-12-20 10:11:00 · 476 阅读 · 0 评论 -
程序员面试金典: 9.1数组与字符串 4字符串中空格全部替换为"%20"
#include #include #include #include using namespace std;/*问题:编写一个方法,将字符串中的空格全部替换为“%20”。 假定该字符串尾部留有足够的控件存放新增字符,并且知道字符串的真实长度分析:先扫描字符串,计算出空格总数n,字符串长度L,由于一个空格和“%20”相差两个字符, 因此替换后的字符串总长原创 2016-12-20 11:21:53 · 305 阅读 · 0 评论 -
程序员面试金典: 9.1数组与字符串 5字符串压缩
#include #include #include #include using namespace std;/*问题:利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。 比如,字符串aabcccccaaa会变为a2b1c5a3.若“压缩”后的字符串没有变短, 则返回原先的字符串。分析:本质上就是寻找相邻相同字母的问题。当相邻两个字符不同时,开原创 2016-12-20 12:11:51 · 278 阅读 · 0 评论