剑指offer
文章平均质量分 61
天地一扁舟
这个作者很懒,什么都没留下…
展开
-
剑指Offer:面试题7 用两个栈实现队列
待补充原创 2019-10-17 22:36:46 · 115 阅读 · 0 评论 -
剑指Offer:面试题23 从上往下打印二叉树
/*从上往下打印二叉树:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11 86 105 79 11输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试原创 2014-09-08 19:52:54 · 665 阅读 · 0 评论 -
剑指Offer:面试题36 数组中的逆序对
/*数组中的逆序对:这是基于归并排序的,而快速排序的某个应用是寻找第k大的数在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在{7,5,6,4}中,一共存在5个逆序对{7,6},{7,5},{7,4},{6,4},{5,4}总结:先把数组分隔成子数组,先统计出子数组内部的逆序对数目,在统计两个原创 2014-09-10 21:53:55 · 769 阅读 · 0 评论 -
剑指Offer:面试题24 二叉搜索树的后序遍历序列
/*二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都不相同。例如:输入数组{5,7,6,9,11,10,8},则返回true.86 105 79 11如果输入的数组时{7,4,6,5},没有哪颗二叉搜索树的后序遍历是这原创 2014-09-08 19:56:39 · 643 阅读 · 0 评论 -
剑指Offer:面试题27 二叉搜索树与双向链表
/*二叉搜索树与双向链表:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中节点指针的指向。比如,输入图中左边的二叉搜索树,则输出转换之后的排序双向链表。106 144 812 16转换为:4->6->8->10->12->14->16 分析:通过中序,首先确定链表的基本轮廓;然后在原有基础上修原创 2014-09-08 20:01:11 · 649 阅读 · 0 评论 -
剑指Offer:面试题35 第一个只出现一次的字符
/*第一个只出现一次的字符:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'分析:直接对每个字符统计次数,用哈希做遍历,应该时间复杂度为O(n)。寻找第一次出现的次数为1的字符时,我们按照字符顺序来遍历题目描述:在一个字符串(1输入:输入有多组数据每一组输入一个字符串。输出:输出第一个只出现一次的字符下标,没有只出现一原创 2014-09-10 21:54:49 · 649 阅读 · 0 评论 -
剑指Offer:面试题44 扑克牌的顺子
/*扑克牌的顺子:从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。分析:如何确定5个数字是连续的?难道用累加判断过程:1把数组排序,2统计0的个数,3统计数组中相邻元素之间的空缺总数如果空缺总数注意:如果数组中非0数字重复出现,那么不可能是对子输原创 2014-09-10 22:06:23 · 780 阅读 · 0 评论 -
剑指Offer:面试题43 n个骰子的点数
/*n个骰子的点数:把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。骰子一共6个面。n个骰子的和的最小值为n,最大值为6n。n个骰子的所有点数的排列数为6^n。我们需用统计每一个点数出现的次数,然后把每一个点数出现的次数除以6^n,就能求出每个点数出现的概率。递归解法:如何统计每个点数出现的次数?可以把n个骰子分成两堆,第一原创 2014-09-10 22:02:58 · 854 阅读 · 0 评论 -
剑指Offer:面试题30 最小的k个数
/*最小的k个数:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字时1、2、3、4。分析:解法1:可以修改输入的。只需利用划分函数,对下标为k的数字进行划分,那么最左边的k各数字一定是最小的k个数字,但是不一定有序。因为数组的下标是从0开始的,则当iIndex = k -1时,即可解法2:O(nlogK)原创 2014-09-08 20:06:16 · 741 阅读 · 0 评论 -
剑指Offer:面试题39 二叉树的深度
/*二叉树的深度:输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、也节点)形成树的一条路径,最长路径的长度为树的深度 1 2 3 4 5 6 7图中二叉树的深度为4,从根节点1开始经过结点2和5,最终到达叶结点7输入:第一行输入有n,n表示结点数,结点号原创 2014-09-10 21:58:40 · 662 阅读 · 0 评论 -
剑指Offer:面试题41 和为s的两个数字
/*和为s的两个数字:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多对数字的和等于s,输出任意一队即可。例如输入数组{1、2、4、7、11、15}和数字15.由于4+11=15,因此输出4和11。基本方法:固定一个数字,再依次判断其余n-1个数字与它的和是不是等于s。如果小于s,可以选择较小的数字后面的数字如果大于s,可以选择原创 2014-09-10 22:02:51 · 828 阅读 · 0 评论 -
剑指Offer:面试题22 栈的压入、弹出序列
/*栈的压入、弹出序列:关键:设定一个辅助栈。辅助栈中存放的就是弹出序列,数据栈中:按照压栈序列,逐个压入元素,当辅助栈的栈顶元素与数据栈的栈顶元素相等时,两者同时弹出栈顶。然后再比较辅助栈的栈顶是否数据栈的栈顶元素相同,若不相同,再向数据栈内压入元素,直至压入的元素和辅助栈的栈顶元素相同时,两者再同时弹出。如果发现辅助栈的栈顶元素,不仅与数据栈的栈顶元原创 2014-09-08 19:50:54 · 624 阅读 · 0 评论 -
剑指Offer:面试题34 丑数
/*丑数:我们把只包含因子2、3和5的数称为丑数,求按照从小到大的顺序的第1500个丑数。例如6,8都是丑数,但14不是丑数,因为它包含因此7.习惯上我们把1当做第一个丑数。分析:采用累除法,凡是能除得尽的都是丑数,模拟素数筛选法来做,对模拟的素数筛选法中,2,3,5书上的方法:创建数组保存已经找到的丑数,用空间换时间。创建一个数组,里面的数字时排好序的丑数,每一个原创 2014-09-10 21:51:24 · 785 阅读 · 0 评论 -
剑指Offer:面试题26 复杂链表的复制
/*复杂链表的复制:请事先函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。A->B->C->D->E兄弟指向"A指向CB指向ED指向BE,C指向NULL原创 2014-09-08 19:59:33 · 644 阅读 · 0 评论 -
剑指Offer:面试题19 二叉树的镜像
/*二叉树的镜像:请完成一个函数,输入一个二叉树,该函数输出它的镜像。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n(0Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。原创 2014-09-08 19:47:27 · 583 阅读 · 0 评论 -
剑指Offer:面试题40 数组中只出现一次的数字
/*数组中只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两个,请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)分析:直接遍历,统计次数O(n),但空间复杂度为O(n)书析:a^a = 0,任何一个数字异或自己为0,所以从头到尾依次异或数组中的每个数字,那么最终结果恰好是那个只出现一次的数字。试着把原数组分成原创 2014-09-10 22:01:51 · 737 阅读 · 0 评论 -
剑指Offer:面试题2 实现Singleton模式
/*实现Singleton模式:设计一个类,只能生成该类的一个实例*/#include #include #include #include using namespace std;//版本1:标准实现,为空new一个出来,需要在程序结束时,释放内存class Singleton{public:static Singlet原创 2014-09-06 00:58:56 · 823 阅读 · 0 评论 -
剑指Offer:面试题4 替换空格
/*替换空格:请事先一个函数,把字符串中的每个空格替换成"%20"。例如输入:We are happy.MaChao输出:We%20are%20happy.MaChao*//*关键:1 第一次遍历字符串统计空格数,计算新的字符串长度2 采用p1指向原来结尾,p2直线新结尾,然后不遇见空格时,依次复制, 遇见空格,p1不动,p2连减三次,每次原创 2014-09-06 01:02:44 · 587 阅读 · 0 评论 -
剑指Offer:面试题6 重建二叉树
/*利用前序和中序,求后续遍历结果输入:FDXEAG(前序)XDE F AG(中序):例如找到F=3(i),则前序的左子树遍历范围是:s1+1到s1+3(i),右子树遍历范围是:s1+3(i)+1到e1输出:XEDGAF(后序)*/#include #include const int MAXSIZE = 100000;typedef s原创 2014-09-06 01:07:04 · 672 阅读 · 0 评论 -
剑指Offer :面试题13 在O(1)时间删除链表节点
/*在O(1)时间删除链表节点:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点。链表结点与函数的定义如下:关键:找到该节点{如果该节点后面还有节点,将其值与其后面的节点交换,然后删除该节点本身 {如果该节点后面没有节点,需要找到其前面的节点,将其前面节点的指向节点指针置空如果该节点为头节点,那么另其头节点为其后面节点的指针原创 2014-09-08 19:35:54 · 649 阅读 · 0 评论 -
剑指Offer:面试题15 链表中倒数第k个结点
/*链表中倒数第k个节点:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。例如一个链表有6个节点,从头节点开始它们的值依次是1,2,3,4,5,6。这个链表的倒数第三个节点是值为4的结点。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和k(0原创 2014-09-08 19:39:52 · 637 阅读 · 0 评论 -
剑指Offer面试题16 反转链表
/*反转链表:定义一个函数,输入一个链表的头结点,反转该链表并输出翻转后链表的头结点。分析:假设h,i,j三个节点。h节点已经指向前面的节点,i节点要指向h节点,这时,i与j中间断开,因此在将i节点指向h节点之前,先记下j节点。因此调整时:需要知道当前节点以及当前节点前面一个节点,以及当前节点后面一个节点。因此,我们需要设置三个节点。刚开始将头结点赋原创 2014-09-08 19:41:16 · 590 阅读 · 0 评论 -
剑指Offer:面试题题17 合并两个排序的链表
/*合并两个排序的链表:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。例如输入图中的链表1和链表2,则合并之后的升序链表入链表3所示链表1: 1 3 5 7链表2: 2 4 6 8链表3: 1 2 3 4 5 6 7 8输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整原创 2014-09-08 19:43:36 · 643 阅读 · 0 评论 -
剑指Offer:面试题25 二叉树中和为某一值的路径
/*二叉树中和为某一值的路径:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的结点形成一条路径。 105 124 7例如:输入整数和22,打印出两条路径:10、12,10、5、7分析:路径是从根节点出发到叶节点。需要遍历根节原创 2014-09-08 19:58:16 · 615 阅读 · 0 评论 -
剑指Offer:面试题49 把字符串转换成整数
/*把字符串转换成整数:输入:输入可能包含多个测试样例。对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1输出:对应每个测试案例,若输入为一个合法的字符串(即代表一个整数),则输出这个整数。若输入为一个非法的字符串,则输出“My God”。样例输入:5-5+8样例输出:5-58*//*关键:1原创 2014-09-10 22:11:30 · 985 阅读 · 0 评论 -
剑指Offer:面试题38 数字在排序数组中出现的次数
/*数字在排序数组中出现的次数:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。分析:关键是找到2和4,即第一个是3的字符的位置和第一个不是3的字符的位置,然后利用下标相减就可以。起始本质上是lowerBound和upperBound问题的翻版lowerBound:upperB原创 2014-09-10 21:59:45 · 770 阅读 · 0 评论 -
剑指Offer:面试题7_2 用两个队列实现一个栈
/*用两个队列实现一个栈:通过栈的操作分析队列模拟栈的过程。先往栈内压入一个元素a,把a压入queue1,接下来继续往栈内压入b、c两个元素,把他们都插入到queue1:{a,b,c},从栈内弹出一个元素:应该将c弹出,但c在尾部,先在queue1中删除元素a,b,并插入到queue2中,再从queue1中删除元素c。说白了,两个队列互相利用,除最后一个元素以外的其余元素全部放到另一...原创 2014-09-06 01:07:24 · 590 阅读 · 0 评论 -
剑指Offer:面试题9 斐波那契数列
/*斐波那契数列:写一个函数,输入n,求斐波那契数列的第n项f(n)={0,n=0 {1,n=1{f(n-1)+f(n-2),n>1输入:11输出:89*/#include #include const int MAXSIZE = 100000;long long fib[MAXSIZE];long long fibonacci(原创 2014-09-06 01:11:06 · 653 阅读 · 0 评论 -
剑指Offer:面试题10 二进制中1的个数
/*位运算:左移时,右边补零右移时{正数,左边补零 {负数,左边补1二进制中1的个数:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.输入:9-9输出:231样例输入:345-1样例输出:1232思路:将10进制原创 2014-09-06 01:13:00 · 597 阅读 · 0 评论 -
剑指Offer:面试题8 :旋转数组的最小数字
/*旋转数组的最小数字:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。分析:这里可以思维开拓些,使用二分搜索方法来做。由于最小的元素恰好是两个子序列的分界线。当前元素若大于最左边元素,说明还没有找到,原创 2014-09-06 01:12:00 · 580 阅读 · 0 评论 -
剑指Offer:面试题11 数值的整数次方
/*数值的整数次方:实现函数double Power(double base,in exponent),求base得exponent(指数)次方,不得使用库函数,同时不需要考虑大数问题。输入:输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开原创 2014-09-08 19:29:24 · 663 阅读 · 0 评论 -
剑指Offer:面试题14 调整数组顺序使奇数位于偶数掐面
/*调整数组顺序使奇数(odd)位于偶数(even)前面:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分分析:如果不考虑交换后的所有奇数的顺序或所有偶数的顺序,从后向前与从前向后交换调整(类似于快排的方法)前面是偶数,后面是奇数就交换考虑扩展性的解法:把题目改成数组中的数按照原创 2014-09-08 19:34:46 · 612 阅读 · 0 评论 -
剑指Offer:面试题47 不用加减乘除做加法
/*不用加减乘除做加法:写一个函数,求两个整数之和,要求在函数体内不得使用+,-,*,/四则运算符号分析:尝试把二进制的加法用位运算来代替。第一步不考虑进位对每一位相加。0加0,1加1的结果都是0,因此这里的加法与亦或效果相同。只有1加1才能进位,即左移一位想象成是两个数先做位与运算,然后在向左移动一位。只有两个数都是1的时候,位与的结果是1,其余都是0.第三步相加原创 2014-09-10 22:07:47 · 709 阅读 · 0 评论 -
剑指Offer:面试题21 包含min函数的栈
/*包含min函数的栈:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)分析:如果直接遍历来找,需要O(n)如果要实现是O(1),基本只能靠hash了,栈的最小元素绝对应该放到栈顶或在栈顶寻找到,否则不可能是O(1)如何将最小元素放到栈顶?每次放的时候,将大的放在下面,小的放在原创 2014-09-08 19:50:37 · 626 阅读 · 0 评论 -
剑指Offer:面试题20 顺时针打印矩阵
/*顺时针打印矩阵:输入一个矩阵,按照从外向里顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行包括两个整原创 2014-09-08 19:46:47 · 565 阅读 · 0 评论 -
剑指Offer:面试题12 打印1到最大的n位数
/*打印出1到最大的n位数:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999分析:可能是大数问题,要大数解决在字符串上模拟数字加法的解法:用字符串表示数字时,字符串里的每个字符表示0到9之间的某一个字符,表示数字中的一位。因为数字最大是n位的,因此我们需要长度为n+1的字符串(最后一位时'\0')。原创 2014-09-08 19:33:27 · 590 阅读 · 0 评论 -
剑指Offer:面试题3 二维数组中的查找
/*二维数组中的查找:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数输入:4 451 2 8 92 4 9 124 7 10 136 8 11 154 471 2 8 92 4 9 124 7 10 13原创 2014-09-06 00:58:29 · 728 阅读 · 0 评论 -
剑指offer 面试题1:赋值运算符
/*赋值运算符函数:如下为类型CMyString的声明,请为该类型添加赋值运算符函数*//*关键:1 赋值运算符要考虑四点:返回为引用,否则无法连续赋值参数声明为常引用忘记分配新内存之前释放原有内存会内存泄露判断参数与当前实例是否相同2 初级版:if(this == &str)//判断同一性{return *this;}原创 2014-09-06 00:55:05 · 818 阅读 · 0 评论 -
剑指Offer: 面试题5 从尾到头打印链表
/*从尾到头打印链表:输入一个链表的头结点,从尾到头反过来打印出每个节点的值输入一个链表,从尾到头打印链表每个节点的值。输入:每个输入文件仅包含一组测试样例。每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。输出:对应每个测试案例,以从尾到头的顺序输出链原创 2014-09-06 01:02:31 · 799 阅读 · 0 评论 -
剑指Offer:面试题45 圆圈中最后剩下的数字
/*圆圈中最后剩下的数字:0,1,。。。,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。这是C语言书上的一道题目设置一个剪枝数组,设定一个循环,循环出口是只剩一个元素,刚开始置剩余元素总数目为n,后面会更新。注意每次当计数器变量走到n时,表明一个循环结束了,应将n变为0,从头开始遍历,小的圆圈是通过m取余来遍历原创 2014-09-10 22:07:58 · 837 阅读 · 0 评论