剑指offer笔记
剑指offer
poetliu
这个作者很懒,什么都没留下…
展开
-
剑指offer-面试题37.两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点,链表结点的定义如下:1 struct ListNode2 {3 int m_nKey;4 ListNode* m_pNext; 5 } 一共三种方法解答此题目:方法1:双层遍历链表,复杂度为O(m*n)方法2:有两个栈存储链表结点模拟从后往前遍历方法3:先计算出两原创 2016-04-08 13:04:14 · 591 阅读 · 0 评论 -
剑指offer-面试题32.从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计算每个数中1的个数,然而这种方法是效率很低下的书上给出了一共方法,去找数n各个位置上出现1的规律,在这里我就不再描述具体的规律推倒过程,只是给出这样一个普遍性的规律。原创 2016-04-08 13:02:49 · 731 阅读 · 0 评论 -
剑指offer-面试题31.连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或者连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度O(n) 本题可以把所有子数组全部找出来再求其和的最大值便可以得出,但是这样会导致算法的时间复杂度为0(n^2),所以有两种方法来解决这个问题。方法1.数组扫描我们扫描一遍数组并且累加数组元素的和,当遇到累加和为负数的时候,我们从数组中下一个元素开原创 2016-04-08 13:01:25 · 585 阅读 · 0 评论 -
剑指offer-面试题30.最小的k个数
题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方法是parition方法,一种方法是建立一个大小为k的堆进行topk求解 这里我们只解释第一种方法:1.首先随机查找数组中一个元素作为一个基准,然后pariti原创 2016-04-08 12:54:19 · 725 阅读 · 0 评论 -
剑指offer-面试题29.数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出整个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在整个数组中出现5次,超过数组长度的一半,输出2. 此题的解法有很多种,剑指offer书中提出了两种,一种是Parition的方法,另外一种是计数的方法。 这里我们用计数的方法来实现一下。试想当我们遍历数组的时候用一个计数器原创 2016-04-08 12:53:16 · 774 阅读 · 0 评论 -
剑指offer-面试题28.字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 此题的主要步骤由如下几步:1.求出所有可能出现在第一个位置的字符2.将第一个字符与后面字符分别交换3.将第一个字符后面的字符递归步骤1,2 代码如下: 1 #原创 2016-04-08 12:52:26 · 627 阅读 · 0 评论 -
剑指offer-面试题27.二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的结点,只能调整树种结点指针的指向。比如输入下图的二叉搜索树,则输出转换后的双向排序链表。1 102 / \3 6 144 / \ / \5 4 8 12 16转换后原创 2016-04-08 12:51:36 · 610 阅读 · 0 评论 -
剑指offer-面试题26.复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如下:1 struct ComplexListNode2 {3 int m_nValue;4 C原创 2016-04-08 12:47:02 · 591 阅读 · 0 评论 -
剑指offer-面试题25.二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中借点值得和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点定义:1 struct BinaryTreeNode2 {3 int m_nValue;4 BinaryTreeNode* m_pLeft;5 BinaryTreeNode* m_pRight;6原创 2016-04-08 12:46:18 · 453 阅读 · 0 评论 -
剑指offer-面试题24.二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序,如果是,则返回true,如果不是则返回false,假定输入的数组中任意两个数都不相等。 此题目我们以5,7,6,9,11,10,8为例解题步骤如下:1.先找到序列的最后一个元素82.按照顺序从序列的从前往后遍历,知道遇到第一个大于8的数即9,3.那么元素9以前为左子树,全部小于跟节点原创 2016-04-08 12:45:15 · 485 阅读 · 0 评论 -
剑指offer-面试题23.从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入的二叉树,则依次打印出8、6、10、5、7、9、11二叉树结点的定义如下:1 struct BinaryTreeNode2 {3 int m_nValue;4 BinaryTreeNode* m_pLeft;5 BinaryTreeNode* m_pRight;6原创 2016-04-07 20:55:01 · 630 阅读 · 0 评论 -
剑指offer-面试题22.栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该该压栈序列的弹出序列。 这种判断其实只要掌握栈的先进后出原则,则不难解决。本题的题解步骤如下:1.设原创 2016-04-07 20:45:17 · 519 阅读 · 0 评论 -
剑指offer-面试题21.包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值:1.在模板类定义两个栈类型私有成员变量,一个为保存数据的栈另外一个为保存最小值的栈2.当栈为空的时候直接将数据同时压入数据栈和最小值栈3.当栈不为空的时候,将数据先压入数原创 2016-04-07 20:43:55 · 517 阅读 · 0 评论 -
剑指offer-面试题20.顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入一个矩阵如下:1 1 2 3 42 5 6 7 83 9 10 11 124 13 14 15 16 则依次打印出数字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10这道题的类似于:http:原创 2016-04-07 20:36:00 · 545 阅读 · 0 评论 -
剑指offer-面试题19.二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二叉树节点定义如下:1 strcut BinaryTreeNode2 {3 int val;4 strcut BinaryTreeNode* m_pleft;5 strcut BinaryTreeNode* m_pright;6 } 本题可以参考http://www.c原创 2016-04-07 20:34:43 · 404 阅读 · 0 评论 -
剑指offer-面试题18.树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:1 struct BinaryTreeNode2 {3 int m_nValue;4 BinaryTreeNode* m_pLeft;5 BinaryTreeNode* m_pRight;6 }; 求子树的思路大概是这样的:原创 2016-04-07 20:29:43 · 830 阅读 · 0 评论 -
剑指offer-面试题17.合并两个排序的链表
题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。例如链表1链表2合并为链表3.1 List1:1->3->5->723 List2:2->4->6->84 5 List3:1->2->3->4->5->6->7->8链表结点定义如下:1 struct ListNode2 {3 int m_nVal原创 2016-04-07 20:28:10 · 568 阅读 · 0 评论 -
剑指offer-面试题16.反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点链表结点定义如下:1 struct ListNode2 {3 int m_nKey;4 ListNode* m_pNext;5 } 其实反转链表主要是链表指针的操作,一定要很清楚才行。其实在面试题5,从尾到头打印链表的第一种方式已经实现了这种方式:原创 2016-04-07 20:26:53 · 440 阅读 · 0 评论 -
剑指offer-面试题15.链表中倒数第k个结点
题目:输入一个链表,输出该链表的倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个节点。例如有一个链表有6个节点,从头节点开始他们的值依次是1,2,3,4,5,6.这个链表的倒数第三个节点是值为4的节点。 这个题目常规情况下我们都是考虑先从链表的头遍历到链表的尾,然后后退k步取倒数第k个节点的值。 然而我们也可以这样考虑先原创 2016-04-07 20:25:04 · 484 阅读 · 0 评论 -
剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门。 这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后就将偶数全部放在了后半部门,奇数放在了前半部分。但是效率不好每次遇到偶数都要原创 2016-04-07 20:23:52 · 569 阅读 · 0 评论 -
剑指offer-面试题13.在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数的定义如下。 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点。然后使得该节点的next指向删除节点的next即可,这样看来删除一个节点的复杂度为O(n)然而我们其实遍历的目的只是想获取想要删除节点的前一个节点。 那么我们可以这样考虑:我们把要删除节原创 2016-04-07 20:22:02 · 485 阅读 · 0 评论 -
剑指offer-面试题12.打印1到最大的n位数
题目:输入数字n,按照打印出从1最大的n位10进制数。比如3,则打印出1、2、3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那只能说明你---太天真。2.n=3尚可,如果n=30 300呢有这样的内置数据类型能包括这么大的数吗?3.说白了,这道题就是考察用字符串模拟大数。 算法思想如下:1.分配大小为n+1个字符原创 2016-04-07 20:20:45 · 437 阅读 · 0 评论 -
剑指offer-面试题11.数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数的问题. 这道题看似很简单:然而需要考虑的方面到不少:1.如何处理指数为负数,将负数当成正数处理 对结果求倒2.当指数为负数的时候并且底数为0的时候如何处理3.当指数为0底数为0的情况原创 2016-04-07 20:19:08 · 626 阅读 · 0 评论 -
剑指offer-面试题10:二进制中1的个数
题目:请实现一个函数,输入一个函数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 这道题最典型的方法就是用移位统计,就比如统计9的二进制1个数:1.9的二进制位1001,9-1的二进制位1000.2.两者做与运算,结果为1表示最后一位为1,否则为03.将1001向右移位一位然后重复上述步骤直到该数字原创 2016-04-07 19:55:06 · 445 阅读 · 0 评论 -
剑指offer-面试题9.斐波拉契数列
题目一:写一个函数,输入n,求斐波拉契数列的第n项。斐波拉契数列的定义如下:1 { 0 n=0; 2 f(n)={ 1 n=1;3 { f(n-1)+f(n-2) n>1; 斐波拉契问题很明显我们会想到用递归原创 2016-04-07 19:44:38 · 457 阅读 · 0 评论 -
剑指offer-面试题8.旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 这道题可以使用类似于二分查找的思想,算法思路如下:1.假设有一个旋转数组A,我们设两个索引p1,p22.p1指向为数组第一个元素,p2指向为数原创 2016-04-07 19:42:13 · 372 阅读 · 0 评论 -
剑指offter-面试题7.用两个栈实现队列
题目.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead分别完成在对尾插入节点和在队头删除节点。 该队列类模板如下: 1 template 2 class CQueue 3 { 4 public: 5 void appendTail(const T& node); 6 T deleteHead(原创 2016-04-07 19:37:09 · 457 阅读 · 0 评论 -
剑指offer-面试题6.重建二叉树
题目:输入某二叉树的前序遍历和中序遍历结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如图所示的二叉树并输出它的头结点。二叉树的定义如下:1 struct BinaryTreeNode2 {3 int m_nValue;4原创 2016-04-07 19:33:36 · 575 阅读 · 0 评论 -
剑指offer-面试题5.从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 刚看到这道题的小伙伴可能就会想,这还不简单,将链表反转输出。但是这种情况破坏了链表的结构。如果面试官要求不破坏链表结构呢,这时候我们就想到了一种数据结构---栈 当我们从前往后遍历链表逐个压栈 然后遍历结束后再逐个出栈。 首先我们先来用第一种方式实现: 1 #include原创 2016-04-07 19:31:19 · 488 阅读 · 0 评论 -
剑指offer-面试题4.替换空格
题目:请实现一个函数,把字符串中的每个空格都替换成"%20"。例如输入"We are happy."则输出"We%20are%20happy." 这道题一看到就能想到直接从前到后遍历字符串,当遇到空格时候先将空格后面的字符串中每个字符向后移动两个位置,然后再把空格及空格之后的两个字符替换为"%20" 剑指Offer书上这样说到:假设字符串长度为n,每遇到一个空格,需原创 2016-04-07 19:29:55 · 441 阅读 · 0 评论 -
剑指offer-面试题3.二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数。 算法流程如下:比如一个二维数组array:1 1 2 8 92 3 2 4 9 124 5 4 7 10 136 7 6 8 11 15 1.这个二维数组原创 2016-04-07 19:25:31 · 430 阅读 · 0 评论 -
剑指offer-面试题2.实例Singleton模式
题目:设计一个类,我们只能生成该类的一个实例这道题显然是对设计模式的考察,很明显是单例模式。什么是单例模式呢,就是就像题目所说的只能生成一个类的实例。那么我们不难考虑到下面几点:1.不能new多个对象,那么必然该类的构造函数是私有的2.类对象只有一个,那么必然该对象只能有一个私有的静态成员变量,该成员变量为类实例或者类实例的指针。3.但是我们同时还要考虑原创 2016-04-07 19:16:21 · 402 阅读 · 0 评论 -
剑指offer-面试题1:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数class CMyString{public: CMyString(char *pData=NULL); CMyString(const CMyString & str); ~CMyString(void);private: char * m_pData;};首先在解答这道题原创 2016-04-07 18:52:08 · 672 阅读 · 0 评论