![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
程序员面试金典
hj605635529
海阔任鱼跃,天高任鸟飞!!
展开
-
面试19之创建一颗高度最小的二叉搜索树
题目描述对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。注意:这只是求高度最小的二叉查找树,不是真的要构建一颗树,完全二叉树的高度最小。为log2^n + 1//第一种方式,二分法,非递归写法。int BuildMinimalBST(vector v原创 2017-04-28 15:57:22 · 1035 阅读 · 0 评论 -
面试13之检查链表是否为回文
题目描述请编写一个函数,检查链表是否为回文。给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。测试样例:{1,2,3,2,1}返回:true{1,2,3,2,3}返回:false#includeusing namespace std;#includestruct ListNode{ int val; struct Li原创 2017-04-23 09:52:44 · 274 阅读 · 0 评论 -
程序员面试金典--面试28之改变几个位,才能将整数A转变成整数B。
题目描述编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。给定两个整数int A,int B。请返回需要改变的数位个数。测试样例:10,5返回:4思路:这道题其实意思就是让你找出两个数有几个位不同,我们先用异或再看这两个数异或后的结果二进制有几个1,则说明要改变几个位。#includeusing namespace std;int CalcCo原创 2017-05-14 12:53:06 · 352 阅读 · 0 评论 -
程序员面试金典 -- 面试29之交换一个数的二进制的奇数位和偶数位
题目描述请编写程序交换一个数的二进制的奇数位和偶数位。(使用越少的指令越好)给定一个int x,请返回交换后的数int。测试样例:10返回:5思路:用这个数与0xAAAAAAAA相与,拿到偶数位,左移一位,变成奇数位,在拿这个数与0x55555555相与,拿到奇数位,右移一位,变成偶数位,奇数位和偶数位相加就变成新的数了。#includeusing names原创 2017-05-14 12:58:03 · 404 阅读 · 0 评论 -
程序员面试金典 --面试30之找出缺失的数
题目描述数组A包含了0到n的所有整数,但其中缺失了一个。对于这个问题,我们设定限制,使得一次操作无法取得数组number里某个整数的完整内容。唯一的可用操作是询问数组中第i个元素的二进制的第j位(最低位为第0位),该操作的时间复杂度为常数,请设计算法,在O(n)的时间内找到这个数。给定一个数组number,即所有剩下的数按从小到大排列的二进制各位的值,如A[0][1]表示剩下的第二个数二进原创 2017-05-14 13:03:00 · 387 阅读 · 0 评论 -
程序员面试金典--面试31之像素设定
题目描述有一个单色屏幕储存在一维数组中,其中数组的每个元素代表连续的8位的像素的值,请实现一个函数,将第x到第y个像素涂上颜色(像素标号从零开始),并尝试尽量使用最快的办法。给定表示屏幕的数组screen(数组中的每个元素代表连续的8个像素,且从左至右的像素分别对应元素的二进制的从低到高位),以及int x,int y,意义如题意所述,保证输入数据合法。请返回涂色后的新的屏幕数组。测试原创 2017-05-14 13:08:04 · 416 阅读 · 0 评论 -
程序员面试金典--面试32之碰撞的蚂蚁
题目描述在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率。(这里的相撞是指存在任意两只蚂蚁会相撞)给定一个int n(3测试样例:3返回:0.75思路:每个顶点连着两条边,所以一只蚂蚁有两种选择,可以随意的走一条边,n只蚂蚁有2^n种路线,但是只有每只蚂蚁走不同的边才不会碰撞,所以有顺时针和逆时针两种安全走法,其他的走法都原创 2017-05-14 13:14:21 · 360 阅读 · 0 评论 -
程序员面试金典--判断直线相交
题目描述给定直角坐标系上的两条直线,确定这两条直线会不会相交。线段以斜率和截距的形式给出,即double s1,double s2,double y1,double y2,分别代表直线1和2的斜率(即s1,s2)和截距(即y1,y2),请返回一个bool,代表给定的两条直线是否相交。这里两直线重合也认为相交。测试样例:3.14,3.14,1,2返回:false思路:原创 2017-05-14 13:18:50 · 398 阅读 · 0 评论 -
程序员面试金典--面试34之加法运算替代
题目描述请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。给定两个正整数int a,int b,同时给定一个int type代表运算的类型,1为求a * b,0为求a / b,-1为求a - b。请返回计算的结果,保证数据合法且结果一定在int范围内。测试样例:1,2,1返回:2思路:减法直接使用补码变为加法:按位取反+1,要看清题目原创 2017-05-14 13:22:15 · 403 阅读 · 0 评论 -
程序员面试金典--面试26之介于0和1之间的实数,类型为double,返回它的二进制表示
题目描述有一个介于0和1之间的实数,类型为double,返回它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,返回“Error”。给定一个double num,表示0到1的实数,请返回一个string,代表该数的二进制表示或者“Error”。测试样例:0.625返回:0.101思路:0.5 == 1.0 / (2) 0.25 == 1.0 / (2原创 2017-05-05 23:41:16 · 756 阅读 · 0 评论 -
程序员面试金典--面试27之有一个正整数,请找出其二进制表示中1的个数相同、且大小最接近的那两个数
题目描述有一个正整数,请找出其二进制表示中1的个数相同、且大小最接近的那两个数。(一个略大,一个略小)给定正整数int x,请返回一个vector,代表所求的两个数(小的在前)。保证答案存在。测试样例:2返回:[1,4]思路:这道题没想到什么好办法,只想到了暴力法,先判断这个数二进制有几个1,然后前面那个数从x-1开始试,后面那个数从x+1开始试,看那个数的二进制中原创 2017-05-06 00:23:33 · 1381 阅读 · 1 评论 -
面试14之请实现一种数据结构SetOfStacks
题目描述请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。给定一个操作序列int[][2] ope(C++为vector>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][]原创 2017-04-24 21:41:01 · 718 阅读 · 0 评论 -
面试15之用两个栈去实现一个队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。:入队:将元素进栈A出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈; 如果不为空,栈B直接出栈。#includeusing namespace std;#includeclass Solution{原创 2017-04-25 10:03:05 · 195 阅读 · 0 评论 -
面试16之双栈排序
题目描述请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。测试样例:[1,2,3,4,5]返回:[5,4,3,2,原创 2017-04-26 13:50:57 · 276 阅读 · 0 评论 -
面试17之判断一颗树是不是平衡二叉树
题目描述实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。题目分析: : 平衡二叉树是通过左右子树的高度来判断是否为平衡二叉树的,所以我们首先想到的是如何求一个树的高度,求一个树的高度很简单原创 2017-04-27 16:02:34 · 655 阅读 · 0 评论 -
面试12之给定两个链表ListNode* A,ListNode* B,请返回A+B的结果
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。测试样例:{1,2,3},{3,2,1}返回:{4,4,4}本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位原创 2017-04-23 08:43:37 · 5467 阅读 · 2 评论 -
面试11之以给定值x为基准将链表分割成两部分
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。分析:(1)创建两个链表,把大于等于x的放到链表big,小于x的放到链表small (2)将两个链表拼接起来,注意处原创 2017-04-23 00:26:14 · 1425 阅读 · 0 评论 -
程序员面试金典--面试24之二叉树和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路: 递归先序遍历树, 把结点加入路径。 若该结点是叶子结点则比较当前路径和是否等于期待和。是的话打印从根节点到叶子节点的路径。 弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结原创 2017-05-04 21:14:43 · 217 阅读 · 0 评论 -
面试题1之确定一个字符串的所有字符是否全都不同
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。测试样例:"aeiou"返回:True"BarackObama"返回:Fa原创 2017-04-13 18:04:26 · 833 阅读 · 0 评论 -
面试题2之翻转一个给定的字符串
请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。测试样例:"This is nowcoder"返回:"redocwon si sihT"#includeusing namespace std;#inclu原创 2017-04-13 18:43:01 · 1168 阅读 · 0 评论 -
面试7之请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。
题目描述请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。给定一个N阶方阵int[][](C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。测试样例:[[1,2,3],[0,1,2],[0,0,1]]返回:[[0,0,3],[0,0,0],[0,0,原创 2017-04-18 11:41:50 · 1377 阅读 · 0 评论 -
面试20之创建含有某一深度上所有结点的链表。
题目描述对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。:层次遍历 这个题目的意思就是输原创 2017-04-29 00:14:38 · 611 阅读 · 0 评论 -
面试3之确定其中一个字符串的字符重新排列后,能否变成另一个字符串
题目描述给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。测试样例:"This is nowcoder","is This nowcoder"原创 2017-04-14 13:50:02 · 826 阅读 · 0 评论 -
面试21之检查一颗二叉树是否为二叉查找树
题目描述请实现一个函数,检查一棵二叉树是否为二叉查找树。给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。树节点的定义:struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x)原创 2017-05-01 00:05:12 · 627 阅读 · 0 评论 -
程序员面试金典--面试22之寻找二叉树中指定结点的下一个结点
题目描述请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。方式一:中序遍历树,将树中节点的值保存到vector中,再遍历一遍vector,找到指定的值的下一个。原创 2017-05-01 12:59:21 · 316 阅读 · 0 评论 -
面试8之给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成
假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world","worldhell原创 2017-04-19 19:58:33 · 5936 阅读 · 1 评论 -
面试4之字符串中的空格全部替换为“%20”
请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。测试样例:"Mr John Smith”,13返回:"Mr%20John%20Smith"原创 2017-04-15 23:40:55 · 331 阅读 · 0 评论 -
面试5之编写一个方法,实现基本的字符串压缩功能。
题目描述利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。测试样例"aabccccca原创 2017-04-16 23:06:22 · 1466 阅读 · 0 评论 -
程序员面试金典--面试23之求出满二叉树a和b点的最近公共祖先的编号
题目描述有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。给定两个int a,b。为给定结点的编号。请返回a和b的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。测试样例:2,3返回:1分析:这道题因为说了是满二叉树,所以父节点的编号是孩子节点的编号除以2,原创 2017-05-02 23:47:32 · 413 阅读 · 0 评论 -
面试6之像素(矩阵)翻转
题目描述有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,2],[9,6原创 2017-04-17 13:45:56 · 501 阅读 · 0 评论 -
面试9之输入一个链表,输出该链表中倒数第k个结点。
题目描述输入一个链表,输出该链表中倒数第k个结点。#includeusing namespace std;#includestruct ListNode{ int Val; struct ListNode *next; ListNode(int x):Val(x),next(NULL) { } };ListNode* FindKthToTail(ListNode原创 2017-04-21 16:55:39 · 270 阅读 · 0 评论 -
面试10之删除非尾节点
题目描述实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true思路:正常的删除一个结点思路是,给定一个链表头和一个结点。当访问到指定结点pNode时,即pHead->next 等于指定结点, pHead->next = pNode->next->next原创 2017-04-21 17:00:30 · 188 阅读 · 0 评论 -
面试18之猫狗队列
题目描述 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。 给定一个操作序列int[][2] ope(C++中为vector>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表原创 2017-04-27 19:06:43 · 424 阅读 · 0 评论