面试题
文章平均质量分 54
皓皓松
与坚持梦想者同行!
展开
-
【面试题】剑指Offer-3-在二维数组中进行查找
题目概述给一个二维数组(例如下图),在二维数组的每一列,每一行中,元素的大小是递增的;如何快速判断一个数存不存在解题思路这里呢,从右上角开始判断,6的下标(0,2)有四种情况1、就是要查找的元素,则返回TRUE2、比要查找元素大,则x坐标+1,缩小判断的范围3、比要查找元素小,则y坐标-1,缩小判断的范围4、范围内不包括任何元素,则表示没有找到,范围FALS原创 2017-03-09 15:08:19 · 606 阅读 · 0 评论 -
【面试题】剑指Offer-15-求倒数第K个节点
题目概述解决方法用两个指针pSlow和pFastpFast先走上K步然后pSlow和pFast一块走当pFast走到末尾时,pSlow所指向的节点就是倒数第k个节点注意事项注意特殊情况以及临界情况的判断当传入的链表指针为空的情况,以及当传入的K小于链表的长度的情况代码实现原创 2017-04-05 11:30:19 · 490 阅读 · 0 评论 -
【面试题】剑指Offer-37-求两个链表的第一个公共节点
题目概述解题思路首先,分别求出两个链表L1,L2的长度L1_length,L2_length比较L1_length,L2_length的大小,并求出差值的绝对值K定义两个指针cur1,cur2,分别指向两个链表令长度较长的链表先走K步然后同时走,直到两个指针指向的位置相同停止注意:题目要求的是求两个链表的第一个公共节点,这里我们假设已经确定两条链表是相交原创 2017-04-17 18:43:51 · 550 阅读 · 0 评论 -
【面试题】剑指Offer-14-调整顺序使奇数位于偶数的前面
题目概述解决思路用两个指针left和right,分别从数组的两端向中间进行遍历如果left找到了一个偶数,right找到一个奇数然后互换直到left和right相等代码实现#includeusing namespace std;#include//判断一个数是否为偶数bool IsEven(int num){ if (num % 2 == 0)原创 2017-04-04 12:09:50 · 634 阅读 · 0 评论 -
【面试题】剑指Offer-13-在O(1)的情况下删除一个节点
题目概述删除一个节点的普通方法在无头的单链表中我们知道,删除一个节点,需要找到该Del节点的前面一个节点Pre,然后找到删除节点Del的下一个节点Next让Pre的指向下一个的指针指向Next即可当然,不要忘了处理只有一个节点的情况然而,该方法的时间复杂度为O(N)在O(1)的情况下删除一个节点由于函数需要传入头结点和删除的节点,我们可以将删除节点Del的下原创 2017-04-04 12:00:12 · 944 阅读 · 0 评论 -
【面试题】剑指Offer-12-打印1到N最大的数字
题目概述输入数字N,按顺序打印出从1到最大的N位10进制数字比如输入3,则打印1-999之间的数字解决思路直接写个小函数,用循环求出最大的N位数然后再打印注意:当输入的N很大的时候,很有可能造成越界的情况!改进new出来一串字符数组,长度为N+1从低到高依次改变一个位的数字递归判断每一个位如果递归达到长度为N的数字,则打印代码实现#include原创 2017-04-03 20:14:35 · 1336 阅读 · 0 评论 -
【面试题】剑指Offer-31-求连续子数组的最大和
题目概述解法思路定义tmpSum = 0 和 Sum = 0遍历这个数组当tmpSum小于0时,直接将tmpSum赋值为0当tmpSum不小于0时,将tmpSum加上当前的数字如果tmpSum比Sum大,则更新Sum的值代码实现#includeusing namespace std;pair MaxArrOfNum(int* arr, size_t n原创 2017-04-12 10:37:56 · 488 阅读 · 0 评论 -
【面试题】剑指Offer-30-最小的第K个数
题目概述解题思路方法1将数组进行排序,排成升序则最小的K个数便是数组的前K个数字了方法2利用快排的思想利用单趟排序如果排的数字是第K个位置那么其以及其左边的数字就是前面最小的了方法3利用STL中的红黑树原创 2017-04-12 10:29:33 · 618 阅读 · 0 评论 -
【面试题】剑指Offer-29-找到出现次数超过一半的数字
题目概述解题思路方法1进行排序,排序后,超过一半次数的数字一定会出现数组的最中间的位置上方法2利用快排的思想,单次排序,会将数组分成两个区间通过判断所分区间的中间元素是否为数组的中间值来进行逐次划分求解这里和快排很相似,就没有实现时间复杂度为O(N)方法3巧妙思路用两个变量,一个保存当前记录的数字,一个保存次数(初始化为0)遍历一遍数组原创 2017-04-11 11:42:24 · 576 阅读 · 0 评论 -
【面试题】剑指Offer-16-反转链表
题目概述解决思路定义指针【pCur】和【pPrev】并定义【pReverseHead】来保存返回后的头结点当【pCur】不为空的时候,进行循环先求出pCur】的下一个节点【pNext】节点,并判断其是否为空(判断【pCur】是否为最后一个节点)如果是,则需要对【pReverseHead】进行赋值否则,将【pCur】的下一个节点的指针指向pPrev】并将【pP原创 2017-04-05 11:38:17 · 486 阅读 · 0 评论 -
【面试题】剑指Offer-35-第一个只出现一次的字符
题目概述解题思路定义一个256个长度的字符数组将每一个元素初始化成0遍历一遍字符串将遇到字符对应ASCII码的对应数组下标位置的元素+1遍历完后再次重新遍历字符串,将遇到的字符,根据其对应ASCII码的下标来查找从数组的数字如果是1,那么这个字符就是第一次出现一次的字符了代码实现char FindFisrtNum1Char(const char* s原创 2017-04-13 14:14:03 · 340 阅读 · 0 评论 -
【面试题】剑指Offer-49-模拟实现atoi()函数
题目概述解题思路就像本篇博文的题目所介绍的那样这道题目就是让模拟实现atoi函数结合库中的atoi函数,我们需要处理的情况有以下几种各种情况分析情况1:正常情况,给的字符串“123”,在正常的范围内情况2:字符串为空情况3:传入的数字为负数情况4:字符串中间有异常字符的情况情况5:字符串越界的情况情况6:字符串开头有空格的情况情况7:字符串开原创 2017-04-22 15:45:44 · 871 阅读 · 0 评论 -
【面试题】剑指Offer-48-不能被继承的类
题目概述解题思路方法1定义一个A类如果B类想要继承A类的话就会调用A类的构造函数那么只要将A类的构造函数设置为私有成员B类便无法继承A类了然后我们可以通过设置一个函数,通过在堆上开辟空间来使用A类代码实现//普通方法,将类的构造函数设置为私有//缺点:只可以在堆上创建空间class A{public: static A* GetObj() {原创 2017-04-22 15:25:55 · 543 阅读 · 0 评论 -
【面试题】剑指Offer-47-不用加减乘除做加法
题目概述解题思路比如16+9我们会怎么加呢步骤1:先不进位,算出结果为 16+9=15(没有进位)步骤2:找出进位的位置,9+6会产生进位,也就是个位1,左移一位成为十位是进位10步骤3:将没有进位的结果加上进位的结果 15+10 = 25你可能会问:上面的步骤和解决这道题目有什么关系呢?题目不让用加减乘除,但是可以用位运算求解异或所得到的结果是不带进位的结原创 2017-04-20 12:16:15 · 462 阅读 · 0 评论 -
【面试题】剑指Offer-46-从1加N
题目概述解题思路这道题目不能用循环,同时呢,禁用了if等判断语句表示也不可以用递归求解这道题目考的是对C++语法内容的熟练程度这道题目可以从构造函数,虚函数,函数指针以及模板求解方法1:利用构造函数求解我们可以定义一个类,类有两个静态的成员,一个N,一个Sum并初始化为0每当调用构造函数时,N++,然后用Sum加上当前的N值如此,当我们需要加到X时,便可原创 2017-04-19 19:50:23 · 1134 阅读 · 0 评论 -
【面试题】剑指Offer-40-数组中只出现一次的数字
题目概述解题思路我们知道,一个数和自己异或的结果是0如果这个整形数组中只有一个数字出现一次的话,全部异或后的结果就是出现一次的数字由于这道题目是两个数字a,b出现了一次,我们也可以将所有的数进行异或得到的结果就是a,b异或的结果ret此时,我们可以根据ret的二进制中任何一位数字为1将整形数组分成两组a,b就分别处于这两组之中然后分别对两组进行所有数字异或原创 2017-04-19 16:10:39 · 1087 阅读 · 0 评论 -
【面试题】剑指Offer-18-判断一颗树是否为另一颗树的子树
题目概述解题思路这里用到递归的思想先递归【HasSubTree】找到和子树相同值的节点然后再用另一个递归函数【DoseTree1HasTree2】判断是否相等如果遍历到SubT子树的叶子结点,则匹配成功如果SrcT为空,则匹配没有成功如果都存在,则判断左子树和右子树根据左子树和右子树的返回结果判断此时是否完全匹配如果不匹配,则继续【HasSubTree】原创 2017-04-06 11:40:27 · 717 阅读 · 0 评论 -
【面试题】剑指Offer-17-合并两个有序的单链表
题目概述解题思路定义两个指针pCur1,pCur2分别遍历两个链表定义pPrev1,pPrev2指向pCur1,pCu2的前一个节点根据pCur1,pCur2指向数据的大小进行判断利用pPrev1,pPrev2改变指向注意1、需要定义pNewHead先判断两个链表头部节点的大小并保存小的节点2、在遍历改变指向的时候,注意指针是否为空3、出循环后,必须原创 2017-04-06 11:25:02 · 859 阅读 · 0 评论 -
【面试题】剑指Offer-39-求二叉树的深度和判断一颗树是否为平衡二叉树
题目概述题目1:求二叉树的深度题目2:判断一颗二叉树是否为平衡二叉树解题思路求二叉树的深度二叉树的深度呢,这个问题比较简单递归遍历一遍二叉树,每到一个节点,便返回左子树和右子树深度较大的那个并+1返回判断一颗树是否为平衡二叉树这里呢,也要用到深度所谓的平衡二叉树,就是左子树的深度和右子树的深度相差的绝对值小于2每到一个节点,便定义原创 2017-04-18 09:29:44 · 739 阅读 · 0 评论 -
【面试题】剑指Offer-11-模拟实现Pow
题目要求实现一个函数,输入基数和指数,就该基数的指数次方注意点处理0的非正数幂的情况处理,可以抛异常,这里用的断言实现原理比如求2的16次方,则先求2的8次方,然后平方即可得到16次方的值用递归的方法求解代码实现#includeusing namespace std;#includedouble PowerWithUnsignedExponent(doubl原创 2017-03-31 22:40:37 · 1062 阅读 · 0 评论 -
【面试题】剑指Offer-27-将二叉搜索树转换成排序的双向链表
题目概述解题思路1、递归求解,中序遍历,先找到最左节点2、定义PrevNode ,记录双向链表中前一个节点3、递归内部,将当前节点Root的left指向Prev4、递归内部,将上个节点Prev的right指向Root注意:第一个节点PrevNode是空的代码实现void Convert(Node* root, Node*& prevNode){ if (原创 2017-04-10 11:38:06 · 379 阅读 · 0 评论 -
【面试题】剑指Offer-25-二叉树中和为某一路径的值
题目概述输入一颗二叉树和一个整数,打印出二叉树中节点的值的和为输入整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径算法步骤1、前序递归遍历这颗树,用一个变量记录当前路径的值2、当遍历到一个节点中,就加上当前节点的数值3、若数值比期望的数值大,返回;若数值比期望的数值小,继续向下遍历;如果数值和期望的相等,并且该节点是叶子节点,则打印该路原创 2017-03-23 09:05:13 · 531 阅读 · 0 评论 -
【面试题】剑指Offer-6-根据前序和中序遍历重建二叉树
题目概述现在有某二叉树的前序遍历和中序遍历的结果,根据此来重建二叉树问题分析这道题目旨在考察对前序和中序遍历的特点的掌握解题步骤1、前序遍历的第一个节点即为根节点2、根据根节点,在中序遍历中找出左子树和右子树,并统计左子树和右子树的个数3、递归构建左子树和右子树图解代码实现#pragma once#includeusing namespac原创 2017-03-12 17:55:11 · 1056 阅读 · 0 评论 -
【面试题】剑指offer-1-赋值运算符重载
题目:为String类实现赋值运算符重载这里直接实现深拷贝的String类原创 2017-03-07 16:58:12 · 775 阅读 · 0 评论 -
【面试题】剑指Offer-24-判断一个数组是不是某颗二叉搜索树的后序遍历
blabala原创 2017-03-20 14:50:31 · 702 阅读 · 0 评论 -
【面试题】剑指Offer-5-逆序打印单链表
题目概述设计一个函数,输入一个链表的头结点,从尾到头来打印该链表链表的节点定义如下//节点的定义struct ListNode{ int m_data; ListNode* m_pNext;};考点该题目考察面试者对栈、递归以及循环三方面的相互关联的概念以及对单链表的编程能力实现一个简单的单链表void InitList(ListNode** phea原创 2017-03-10 13:06:00 · 982 阅读 · 0 评论 -
【面试题】剑指Offer-4-替换空格
题目概述实现一个函数,可以把字符串的每个空格替换成“%20”.例如输入"We are human",输出"We%20are%20human".考点这道题目考验了面试者对内存覆盖是否存有高度的警惕,只要保持冷静,思考到从后往前的替换方法,就很好解决了方法步骤1、遍历一遍字符串,找出空格的个数count2、将字符串扩容到对应长度3、从后往前进行拷贝4、根据当前的coun原创 2017-03-10 11:46:21 · 512 阅读 · 0 评论 -
【面试题】剑指Offer-28-字符串的全排列
题目概述昨天做了一套CVTE的面试题,最后一个题目就是字符串的全排列。做过剑指Offer的童鞋一眼就可以看出这是剑指Offer-28题原题目,一点都没变题目解法把字符串看成两个部分,第一个部分为第一个字符,剩下的是后面的字符首先将所有可能出现在第一个位置的字符,将这些字符在每次循环的时候和第一个字符交换、先固定一个字符,求后面字符的排列然后将后面的字符按照前面的原创 2017-03-19 21:35:42 · 735 阅读 · 0 评论 -
【面试题】剑指Offer-2-如何控制一个类生成对象的个数
题目概述原题目是,如何控制一个类只生成一个对象这里我们进行扩展问题1:控制一个类不能生成对象问题2:控制一个类只生成一个对象问题3:控制一个类生成对象的个数在一定数量之间问题1:如何控制一个类不能生成对象解决思路一个类生成对象必然会调用其构造函数这里只需将构造函数定义成私有成员,便可实现一个类无法生成对象代码实现class A{private: A原创 2017-03-09 16:19:14 · 1762 阅读 · 2 评论 -
【面试题】剑指Offer-19-二叉树的镜像
题目概述解题思路首先,我们需要知道什么是二叉树的镜像如图所示,这两颗二叉树便互为镜像实现方法,前序遍历这颗二叉树如果遇到空节点,就返回否则交换两个子孩子遍历完后,便得到了二叉树的镜像代码实现//二叉树的镜像void TreeMirror(TreeNode* root){ if (root == NULL) return; //交换每原创 2017-04-08 19:17:27 · 607 阅读 · 0 评论 -
【面试题】剑指Offer-20-顺时针打印矩阵
题目概述代码实现//打印单独的一圈void PrintCricle(int matrix[], int columns, int rows, int start){ //定义结束的坐标 int EndX = columns - start; int EndY = rows - start; //从左向右进行打印,需要对其X坐标 for (int j = start;原创 2017-04-08 19:21:39 · 507 阅读 · 0 评论 -
【面试题】剑指Offer-9-斐波那契数列&&青蛙跳台阶
题目概述写一个函数,求斐波那契数列的第N项递归实现long long Fib(size_t n){ if (n <= 2) return n - 1; return Fib(n - 1) + Fib(n - 2);}非递归实现long long FibNonR(size_t n){ if (n <= 2) return n - 1; lon原创 2017-03-14 20:30:09 · 1104 阅读 · 0 评论 -
【面试题】剑指Offer-26-复杂链表的复制
题目概述原创 2017-04-10 10:41:47 · 358 阅读 · 0 评论 -
【面试题】剑指Offer-10-统计二进制中1的个数
题目概述实现一个函数,输入一个整数,输入该整数对应二进制中1的个数。例如9的二进制表示形式是1001,有两位是1。此时输入9,那么函数输出2这次,就让我们来求一个 int型(32个BIT位)的正数中二进制1的个数(1)基础版->利用数学方法求解计算方法:基础版代码块:#includeint count_one_bits(int value){ int cou原创 2017-03-14 19:42:31 · 1781 阅读 · 0 评论 -
【面试题】剑指Offer-23-从上往下打印二叉树
题目概述解题思路题目要求的是层序遍历关于层序遍历,我们需要借助辅助的队列从根节点开始,入队然后每次将队头的节点Front的两个孩子Left和Right入队,并将Front出队在出队时,进行打印即可代码实现#includevoid LevelOrder(const TreeNode* root){ if (root == NULL) return;原创 2017-04-09 14:57:06 · 517 阅读 · 0 评论 -
【面试题】剑指Offer-22-栈的压入和弹出序列
题目概述输入两个整数的序列,第一个序列表示入栈的顺序,判断第二个序列是否为该栈的弹出顺序比如1、2、3、4、5 , 序列45321就是该栈序列对应的一个弹出序列,但是43512就不可能是解决思路用一个辅助的栈把输入的第一个序列的数字依次压入栈中,并按照第二个序列的出栈顺序依次出栈合法序列举例非法序列举例代码实现#includeusing nam原创 2017-03-23 10:34:41 · 477 阅读 · 0 评论 -
【面试题】剑指Offer-21-包含Min函数的栈
题目概述这道题目很熟悉了在栈和队列面试题中遇到并讲解过解决方法在栈中多用一个栈来保存最小值当Min栈为空,或者入栈的元素小于Min栈的栈顶元素,则在入元素栈的同时将该元素也一并入到Min栈中从而保证了Min栈的栈顶元素永远都是最小值出栈时,如果出栈的元素是最小元素,则也弹出Min栈的栈顶元素否则,仅仅元素出栈即可代码实现#includeusin原创 2017-04-09 14:34:26 · 898 阅读 · 3 评论 -
【面试题】栈和队列的面试题
题目一:实现一个栈,要求其入栈,出栈,返回最小值的时间复杂度为O(1)这道题目,主要问题在于如何时查找最小元素的时间复杂度为O(1),这里我们先想到了用一个变量存取最小值在仅仅入栈时,我们可以通过该MinElem这个变量来查找最小值是完全没有问题的;但是,如果我们进行出栈,并且把该最小值出栈后,那最小值是不是就找不到了;下面是正确的解法:这里我们要用两个栈,第一原创 2017-02-20 11:21:25 · 2393 阅读 · 0 评论 -
【面试题】剑指Offer-7-两个栈实现一个队列
题目概述用两个栈实现一个队列图解代码实现//两个栈实现一个队列template class QueueBTS { public: void Push(const T& x) { sin.push(x); } void Pop() { assert(!sin.em原创 2017-03-14 13:05:48 · 979 阅读 · 0 评论 -
【面试题】剑指Offer-50-求两个节点的最近公共祖先
题目概述一颗二叉树,给出两个节点,求这两个节点的公共的祖先节点(要求的是离他们是最近的)比如,6和8的公共节点为1,4,但是最近公共节点为4解题思路假设我们求6和8两个节点的公共祖先我们可以遍历一遍二叉树,求出6和8分别的路径6的路径Path1为1,4,5,68的路径Path2为1,4,8这里我们用栈来保存该路径这里比较Path1和Path2的大小由原创 2017-04-22 15:56:22 · 1654 阅读 · 0 评论