剑指offer
S_H-A_N
这个作者很懒,什么都没留下…
展开
-
面试题28:求字符的全排列
输入一字符串(要求不存在重复字符),打印出该字符串中字符中字符的所有排列。例如:输入"abc",输出结果为abc, acb, bac, bca, cab和cba。 算法思路:以abc为例,首先固定a,a之后还有bc,对bc进行全排列,对bc进行全排列可以再把b固定对c进行全排列,只剩一个c时已经到了字符结尾,所以输出当前的序列为abc,然后返回上一步,上一步中是abc,交换bc位置变为转载 2015-06-01 17:48:29 · 471 阅读 · 0 评论 -
面试题32:从1到n的正整数中1出现的次数
题目:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。例如:N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,出现1的次数是5。1) 常规解法不考虑时间效率O(nlogn)通过每次对10取余判断整数的个位数字是否为1(用来判断个位数是否是1),如果大于10,除以10之后再判断个位转载 2015-06-02 15:03:13 · 385 阅读 · 0 评论 -
面试题25:二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 算法思路: 先序遍历二叉树,并用一个vector模拟一个栈,记录路径,将访问过的结点的值放入,遍历的时候先计算当前路径上结点值的总和,并将结点的值放入vector,然后判断当前结点是否是叶子节点并且当前路径总和的值是否与要找的值相等,相等则打印vec转载 2015-06-01 12:31:29 · 468 阅读 · 0 评论 -
面试题27:二叉搜索树转换为有序双向链表
题目:输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。#include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode * m_pLeft;转载 2015-06-01 17:47:26 · 419 阅读 · 0 评论 -
面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。1) 第一种方法,时间复杂度为O(n),此方法会改变数组元素的位置快速排序中有一个步骤是找出一个数,将大于这个数的数字放在这个数字右边,小于这个数字的放在这个数字的左边,这个数字在排序的数组中位置就找到了,第一种方法使用这个思路查找位于中间位置的数字,因为数字出现次数超过了数组长度的一般,所以中间位置转载 2015-06-01 20:29:08 · 393 阅读 · 0 评论 -
面试题26:复杂链表的赋值
有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。structComplexNode{ int m_nValue; ComplexNode* m_pNext; Complex转载 2015-06-01 16:48:51 · 426 阅读 · 0 评论 -
面试题24:二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。算法思路:二叉搜索树特点:左结点小于它的父节点,右结点大于它的父节点后序遍历特点:根节点是后序遍历序列的最后一位,如5、7、6、9、11、10、8,8是根节点,5、7、6是左子树,9、11、10是右子树,根据序列记录根节点的值,然后遍历序列找出小于根节点的元素(根节点的左子树),大于根节点的元素为根节点的右子树,然后划分序原创 2015-05-31 15:21:28 · 380 阅读 · 0 评论 -
面试题23:从上往下打印二叉树
二叉树的层序遍历#include #include using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode * m_pLeft; BinaryTreeNode * m_pRight;}; void TraverseBinaryTr转载 2015-05-31 15:16:44 · 334 阅读 · 0 评论 -
面试题10:求二进制中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。原创 2015-05-29 18:55:32 · 310 阅读 · 0 评论 -
面试题15:输入一个链表,输出该链表中倒数第k个结点。
题目:输入一个链表,输出该链表中倒数第k个结点。思路:设置两个指针p和q,让指针p先走k-1步,然后让p和q同时后移一个结点直到p的下一个结点为空,此时q的位置刚好是倒数第K个结点。注意点:1) k2) 没有第K个结点时struct ListNode{ int m_nValue; ListNode * m_pNext;转载 2015-05-30 14:25:40 · 296 阅读 · 0 评论 -
面试题9:斐波拉契数列
题目:写出斐波拉契序列的非递归写法。原创 2015-05-29 18:54:34 · 335 阅读 · 0 评论 -
面试题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.转载 2015-05-30 15:35:41 · 425 阅读 · 0 评论 -
面试题19:二叉树的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像思路:遍历二叉树,并在遍历的时候如果当前结点的左右子树不为空,交换左右结点。/*递归方法*/void transferByRecursion(BSTreeNode * node){ if(node==NULL) { return; } else { BSTreeNode * temp=node->left;转载 2015-05-30 15:28:48 · 294 阅读 · 0 评论 -
面试题18:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。structBinaryTreeNode{ int m_nValue; BinaryTreeNode * m_pLeft; BinaryTreeNode * m_pRight;}; 思路:遍历树A的结点,每次都以当前结点与树B根节点作比较,如果值不相等,以当前结点的转载 2015-05-30 15:09:57 · 290 阅读 · 0 评论 -
面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。转载 2015-05-30 14:44:02 · 332 阅读 · 0 评论 -
面试题11:数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。转载 2015-05-30 11:03:25 · 302 阅读 · 0 评论 -
面试题30:最小的K个数
题目:输入n个整数,找出其中最小的k个数。1) On的时间复杂度,同样利用partition快排找到第k个数,然后比它小的都在左边,比他大的都在右边,输出K左边的数。1) O(nlogk)的时间复杂度,适合处理海量数据我们可以先创建一个大小为K的数据容器来存储最小的K个数,接下来我们每次从输入的n个整数中读入一个数,如果容器中已有的数字少于K,则直接把这转载 2015-06-01 20:32:57 · 365 阅读 · 0 评论 -
面试题31:连续子数组最大的和
1) 第一种方法#include using namespace std;//为了区分是函数返回0还是输入不合法返回0设置一个变量判断bool inputInvalid=false;int FindMaxSumOfArray(int * numbers,int length){ if(numbers==NULL||length<=0) { inputInvali转载 2015-06-02 12:00:34 · 659 阅读 · 0 评论 -
面试题8:数组的旋转
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1。转载 2015-05-29 18:48:36 · 329 阅读 · 0 评论 -
面试题6:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。struct BinaryTreeNode{ int m_nValue; BinaryTreeN原创 2015-05-29 17:29:50 · 291 阅读 · 0 评论 -
面试题64:数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。原创 2015-05-05 09:16:34 · 720 阅读 · 0 评论 -
面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。 算法思路:最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o(n2)。这题有更好的解决方法,转载 2015-04-27 18:17:35 · 469 阅读 · 0 评论 -
面试题57:删除链表中重复的结点
题目:在一个排序的链表中,如何删除重复的结点?例如将链表1-2-3-3-4-4-5变为1-2-5算法思路:设置三个指针preNode:指向要删除结点的前一个结点,初始化为NULL, pNode:指向当前遍历的结点,pNext:指向当前结点的下一个结点1.pNode指向头结点,开始遍历链表2.第一步将pNext=pNode->next,指向当前结点的下一个结点,判断当前结点的值和原创 2015-05-03 17:56:59 · 416 阅读 · 0 评论 -
面试题53:正则表达式匹配
题目:请实现一个函数用来匹配包含.和*的正则表达式。转载 2015-05-03 12:00:31 · 981 阅读 · 1 评论 -
面试题56:链表中环的入口结点
题目:一个链表中包含环,如何找出环的入口结点?原创 2015-05-03 16:49:58 · 366 阅读 · 0 评论 -
面试题1:赋值运算符函数
作者:xwdreamer出处:http://www.cnblogs.com/xwdreamer题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char *pData=NULL);//构造函数CMyString(const CMyString& str);//转载 2015-05-29 12:35:36 · 182 阅读 · 0 评论 -
面试题46:求1+2+...+n
题目:求1+2+...+n,要求不能使用乘除法。原创 2015-05-01 14:00:26 · 432 阅读 · 0 评论 -
面试题43:n个骰子的点数
题目:转载 2015-04-29 17:16:44 · 1620 阅读 · 0 评论 -
面试题40:数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。原创 2015-04-28 15:31:16 · 464 阅读 · 0 评论 -
面试题33:把数组排成最小的数
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。 算法思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab ,则a ;如果ab > ba,则a > b转载 2015-06-02 15:07:02 · 358 阅读 · 0 评论 -
面试题34:丑数
题目:我们把只包含因子2,3和5的数称作为丑数。求按从小到大的顺序的第1500个丑数。例如6,8都是丑数,但是14不是,因为它包含因子7。习惯上我们把1作为第一个丑数。原创 2015-04-27 10:48:06 · 509 阅读 · 0 评论 -
面试题35:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。 算法思路:字符是一个长度为8的数据类型,因此有256种可能,所以创建一个长度为256的数组,遍历字符串,将当前字符的ASCII码值作为数组的下标,值为当前字符出现的次数,然后再次遍历字符串,找出第一个以当前字符为下标的数组中值为1的字符就是要找的字符。原创 2015-04-27 18:13:57 · 491 阅读 · 0 评论 -
面试题7:用两个栈实现队列
思路:添加时将元素压入栈1,删除时有两种情况,第一种情况栈2为空,此时需要先将栈1的所有元素压入栈2,然后清空栈1,并将栈2的栈顶元素出栈,第二种情况是栈2不为空,此时直接将栈2的栈顶元素出栈即可。转载 2015-05-29 18:40:18 · 281 阅读 · 0 评论 -
面试题22:栈的压入弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。转载 2015-05-31 10:17:52 · 409 阅读 · 0 评论 -
面试题61:按之字形顺序打印二叉树
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如: 8 6 105 7 9 11打印结果为: 810 6 5 7 9 11原创 2015-05-04 11:58:58 · 769 阅读 · 0 评论 -
面试题59:对称的二叉树
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。如果一颗二叉树和它的镜像一样,那么就是对称的。思路:通常前序遍历的时候遍历根节点然后遍历左子树在遍历右子树,定义另一种遍历算法,遍历完根节点之后先遍历右子树,在遍历左子树,判断遍历的结果是否一样,如果一样就是对称的。 8 6 65 7转载 2015-05-04 10:24:47 · 337 阅读 · 0 评论 -
面试题62:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。http://blog.csdn.net/pi9nc/article/details/9701637转载 2015-05-04 13:06:00 · 346 阅读 · 0 评论 -
面试题48:不能被继承的类
题目:用C++设计一个不能被继承的类。原创 2015-05-01 16:22:44 · 314 阅读 · 0 评论 -
面试题58:二叉树的下一个结点
题目:给定一颗转载 2015-05-04 09:37:28 · 478 阅读 · 0 评论 -
面试题63:二叉搜索树的第K个结点
题目:给定一颗二叉搜索树,请找出其中的第K大的结点。思路:原创 2015-05-04 17:35:18 · 392 阅读 · 0 评论