自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 剑指offer-面试题56:链表中环的入口结点

题目:一个链表中包含环,如何找出环的入口结点?例如下图的链表中,环的入口结点是结点3。

2016-04-27 20:45:34 425

原创 剑指offer-面试题55:字符流中第一个不重复的字符

题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是‘g'。当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是'l'。思路:这道题和面试题35非常相似,只不过那里是字符串这里变成字符流,动态的返回的只出现一次的结果。仍然采用哈希表来解决这个问题,用大小为256的数组来模拟哈希表,在面试题35那里

2016-04-26 21:29:17 445

原创 剑指offer-面试题54:表示数值的字符串

题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、“3.1416”及“-1E-16”都表示数值,但"12e“、”1a3.14"、“1.2.3”、“+-5”及“12e+5.4”都不是。思路:表示数值的字符串遵循如下模式:[sign]integral-digits[.[fractional-digits]][e|E[sign]ex

2016-04-26 19:51:20 795

原创 剑指offer-面试题53:正则表达式匹配

题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"匹配,但与“aa.a"及"ab*a"均不匹配。思路:我们从头遍历字符串与模式,如果第一个字符串相等,那么指针可能同时后移,也可能不移,问题在于模式的第二个字符是不是

2016-04-26 16:05:52 1292

原创 剑指offer-面试题52:构建乘积数组

题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i] = A[0]*A[1]*…*A[i-1]*A[i+1]*…*A[n-1],不能使用除法。思路:如果可以使用除法,这道题目很简单,但是要求不能使用!换一种思路,把B[i]拆分成两部分,A[0]*A[1]*…*A[i-1],这是一个累乘的过程,如果乘积用C[i]表示,有C[i] = C[i-

2016-04-25 20:24:42 506

原创 剑指offer-面试题51:数组中重复的数字

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字

2016-04-25 17:48:27 1152

原创 剑指offer-面试题47:不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:四则运算都不能用只能位运算了。其实第一想法就是位运算,位运算转换成二进制才能看出规律,这步是关键!例如4+7,二进制是101+111,考虑二进制的加法,先不考虑进位,101+111结果是010,很明显各个位上做了异或运算。下一步考虑进位,最低位和最高位都产生了进位,进位的结果是1010,最低位产生的进位左

2016-04-23 10:47:05 379

原创 剑指offer-面试题46:求1+2+…+n

题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。方法一:利用构造函数求解。程序不让使用循环,但是我们可以以另一种方式实现循环,譬如利用构造函数,不断的调用构造函数,函数的执行语句放在构造函数内部,当我们创建n个类的实例,构造函数也就执行了n次。class Temp{public: tem

2016-04-22 16:49:59 325

转载 静态类型与动态类型

转载自:http://www.oschina.net/question/54100_20313为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误,需要理解四个名词: 1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。 2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改

2016-04-17 17:02:04 320

原创 剑指offer-面试题45:圆圈中最后的数字

题目:0,1,…,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里最后剩下的数字。思路(1):用环形链表模拟圆圈。int LastRemaining(unsigned int n, unsigned int m){ if(n < 1 || m < 1) return -1; unsigned int

2016-04-16 16:50:04 442

原创 剑指offer-面试题44:扑克牌的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路:把5张牌看成5个数字的数组,大小王看成0以和其他牌区分。判断是否连续,首选想到对数组排序,如果连续,则相邻的两张牌之间间隔为1,如果间隔大于1,我们可以用0(即大小王)填补空缺,如果0可以补满空缺,则说明5张牌是连续的,反之不连续。

2016-04-14 16:38:51 588

原创 剑指offer-面试题43:n个骰子的点数

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s所有可能的值出现的概率。思路:骰子六个点数,所以n个骰子出现的所有可能有6的n次方种。那么这个问题我们专注于求点数和s可能出现的次数,概率相除就可以了。假设点数和为n,那么最后一粒骰子可能出现1,2,3,4,5,6这六种可能,对于倒数第二颗骰子,如果在它之前的所有点数和为n-1,n-2,n-3,n-4,n-5,n-6,那

2016-04-14 11:23:43 996

原创 剑指offer-面试题42:翻转单词顺序VS左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.",则输出"student. a am I"。思路:《编程珠玑》第二章有类似题目,思路就是先翻转每个单词,然后再翻转整体。

2016-04-13 17:13:16 521

原创 剑指offer-面试题41:和为s的两个数字VS和为s的连续正数序列

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。例如输入数组{1,2,4,7,11,15}和数字15.由于4+11 = 15,因此输出4和11。思路:如果固定一个数,再判断其与其他n-1个数的和是不是要求的和,时间复杂度是O(n^2)。很明显不是好的做法,而且注意到数组是已排序的,忽略了这个条件。既然是两个数的和

2016-04-12 21:12:12 543

原创 剑指offer-面试题40:数组中只出现一次的数字

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:采取异或的办法,两个相同的数异或必然等于0。由于0与任何数异或可以得到本身,我们可以用0异或数组的每一个元素。因为存在两个不同的数,所以异或的结果不等于0。结果的位中至少包含一个1。譬如0010,如果以判断倒数第二位是不是1来判断数组中的元素,

2016-04-12 10:09:04 310

原创 剑指offer-面试题39:二叉树的深度

题目一:输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点一次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:如果根结点存在,那么深度至少为1,接下来求左右子树的深度,很明显用递归算法,最后树的深度就是左右子树中深度较大的加上1.int DepthOfBinaryTree(BinaryTreeNode* pRoot){ if(pRoot == NU

2016-04-11 21:31:05 611

原创 剑指offer-面试题38:数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.思路:排序的数组,最直接的想法就是二分查找。但是数字有重复,如果可以找到数字出现的起始位置和终止位置,那么就可以统计数字出现的次数,因此这个问题转化为用二分查找寻找数字出现的第一个位置和最后一个位置的问题。如果取数组的中位数,它等于要查找的数,那么在它

2016-04-11 19:44:50 437

原创 剑指offer-面试题37:两个链表中的一个公共结点

题目:输入连个链表,找出它们的第一个公共结点。思路:两个链表,用两个指针这个问题就over了。因为每个结点只有一个m_pNext指针,所以第一个公共结点之后,链表合并成一条线,必然成Y型结构。我们用两个指针从表头开始遍历,但是需要注意的是两个链表的长度可能不一样,为了保持两个指针的同步让指向长一些的链表的指针先走,先走的步数即为两个链表的长度差。然后开始同时移动指针,发现相同的结点即返回结点值

2016-04-11 16:26:19 344

原创 剑指offer-面试题36:数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中逆序对的个数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。思路:分解这个问题,考虑相邻两个数字构成逆序对的情况。以{7,5,6,4}为例,先分解成{7,5}和{6,4},再分解成长度为1的数组{7},{5},{

2016-04-11 15:45:34 357

原创 剑指offer-面试题35:第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff",则输出'b'。思路:这道题目不难,遍历一遍统计每个字符出现的次数就完了。作者用的是哈希表,因为只需要统计次数,而且字符只有256中,可以用一个大小为256的数组实现。自己用STL里的map容器也实现了,道理完全一样。//哈希表实现输出第一个只出现一次的字符char FirstNotRepeatingChar(c

2016-04-09 20:41:01 410

原创 剑指offer-面试题34:丑数

题目:我们把只包含因子2、3、5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。思路:(1)只包含因子2、3、5,那么用2、3、5除以后必定为1,可以作为丑数的判定标准。从1开始递增数字,每个数都判断是不是丑数,直到找到1500个。这种方法有很大的盲目性,每个数都不断的除以2、3、5效率非常低。(2)不去判

2016-04-09 17:28:56 337

原创 剑指offer-面试题33:把数组排成最小的数

题目:输入一个正整数数组,把数组里的所有数字拼接起来排成一个数,打印能拼接出所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.思路:最直接的算法就是全排列,比较每个数的大小,但是全排列有n!种情况,很明显不是一种好的算法。如果有一种排序规则,数组根据这个规则排序之后能排成一个最小的数字,那么我们只要对数组排序就可以了。排序应该满足这样的要求

2016-04-09 16:05:22 494

原创 剑指offer-面试题32:从1到n整数中1出现的次数

题目:输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中1包含1的数字有1,10,11,和12,1一共出现了5次。思路:(1)遍历解法,从1到n遍历每一个数,每个数判断1的个数,判断1的个数采取不断模10取余的方法,对于数字n,它有logn位,那么时间复杂度为O(nlogn),当n很大时,需要大量的计算,运算效率不高。  (2)如果我们能统计每

2016-04-08 10:43:41 927

原创 剑指offer-面试题31:连续子数组的最大和

这道题以前详细总结过,不再重复了,唯一一点需要改进的是代码的鲁棒性,处理无效输入。采取全局变量的方式,用变量记录输入是否有效,有效的时候输出最大值。算法分析见:http://blog.csdn.net/moses1213/article/details/50499638

2016-04-07 11:32:46 292

原创 剑指offer-面试题30:最小的K个数

题目:输入n个数,找出其中最小的K个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1,2,3,4。思路:这道题目是典型的top K问题。两种方法:(1)如果允许改变数列,半快速排序,是基准值正好为第K个数,那么基准值左边的都是小于它的,即可得到最小的K个数(求最大的过程类似),时间复杂度O(n)。(2)不允许改变数列,采用维护数组的方法,建立一个最大堆。遍历数列,如果

2016-04-06 21:10:02 1299

原创 剑指offer-面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路:如果数组是已排序的,可以很容易实现次数的统计,排序的算法时间复杂度至少是O(nlogn)。这题注意到题目的特殊性,出现次数超过一半,那么排序后中位数肯定就是这个数,我们只要求出最小的n/2个数,

2016-04-06 10:27:06 426

原创 快速排序例程

#include using namespace std;void Swap(int& p1, int& p2){ int temp = p1; p1 = p2; p2 = temp;}void Qsort(int* array, int start, int end){ if(start < end) { int pivot = array[start]; in

2016-04-05 19:59:52 380

原创 字符串的全排列非递归实现算法

题目类似剑指offer的第28题,这里在粘贴一下:题目:输入一个字符串,打印出该字符串中字符放入所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。递归的实现算法:http://blog.csdn.net/moses1213/article/details/51055692这里用非递归的算法实现:假设有字符串p1

2016-04-04 20:30:16 1433

原创 剑指offer-面试题28:字符串的排列

题目:输入一个字符串,打印出该字符串中字符放入所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。思路:全排列的问题实际就是交换问题。把问题划分成两个部分,第一个字符和后面的部分,所以这个问题分为两个步骤:(1)考虑第一个字符的所有可能情况,将第一个字符和后面的所有字符交换;(2)考虑第一个字符后面的整体部分,那么这部分

2016-04-04 11:27:04 707

原创 剑指offer-面试题27:二叉搜索树与双向链

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点只能调整树中结点指针的指向。思路:对于二叉搜索树,根结点的左子树都比它小,右子树都比它大,如果按照中序遍历那么结点就是排序的,问题的关键是如何修改指针指向。假设左右子树已经排序,那么只要将左子树的尾结点连接上根结点,根结点连接上右子树就可以了。关于怎么连接左右子树,还是有一点技巧的。我们每次连接完成之后都

2016-04-03 20:18:45 477

原创 剑指offer-面试题26:复杂链表的复制

题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如下:struct ComplexListNode{int

2016-04-02 20:13:13 694

原创 剑指offer-面试题25:二叉树中和为某一值的路径

题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的形成一条路径。思路:对于每棵子树,它都是一个求解树中结点值的和为输入整数的所有路径的问题,整数为去除它的父节点的和之后新的值,所以很明显可以用递归的方法求解。那么对于每个结点,怎样判断是否已经是要求的路径呢?题目要求和为整数且是叶结点。作者给出的思路简单粗暴,那就是遍历,不管加

2016-04-02 16:36:02 559

原创 剑指offer-面试题24:二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路:如果熟悉二叉搜索树的特征这题就不难解了。复习一下二叉搜索树。对于二叉搜索树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;那么后序遍历的结果就是:根结点排

2016-04-01 22:06:43 389

原创 剑指offer-面试题23:从上往下打印二叉树

题目:从上往下打印二叉树的结点,同一层的结点按照从左到右的顺序打印。思路:先打印根结点,那么为了打印根结点的两个子结点,需要一个容器将两个子结点保存起来。然后打印左子树,过程和打印根结点类似,也需要将左子树的左右子结点保存起来。这时候容器里存有根结点的的右子树和左子树的两个子结点。接下来要打印右子树了,需要从容器里取出右子树,由于右子树相比左子树的两个子结点先入容器,先入先出,所以这是一个队列

2016-04-01 19:45:38 315

原创 剑指offer-面试题22:栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设入栈的所有数字均不相等。思路:用一个栈来模拟入栈过程。如果弹出序列的元素a不等于栈顶,那么说明它还没有入栈,从压入顺序里将元素a以及它之前的元素全部入栈。如果所有压入顺序中的元素都已入栈还是没有在栈顶找到元素a,说明弹出序列是错误的。如果元素a刚好等于栈顶,直接出栈。最后的过程应该是所有元素都出栈而且

2016-04-01 11:36:51 314

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除