随笔分类 - 剑指Offer
摘要:题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:按照广度优先遍历来遍历二叉树,但是需要按照之字形来打印,意味着:奇数行从左到右,跟BFS的遍历顺序一样,而偶数行从右到左,跟BFS的遍历顺序相反...
阅读全文
摘要:题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:很明显,采用广度优先遍历来解决,但因为需要按行输出,所以需要判断每一层的开始和结束,因此需要两个变量,一个表示当前层尚未打印的结点数,一个表示下一层结点的数目。在线测试:http://www.nowcoder.com/boo...
阅读全文
摘要:题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:对于一棵二叉树,从根结点开始遍历,如果左右子结点有一个为NULL,那么肯定不是对称二叉树;如果左右子结点均不为空,但不相等,那么肯定不是对称二叉树;如果左右子结点均不为空且相等,...
阅读全文
摘要:题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:考虑中序遍历的过程,如果当前结点存在右子节点,那么当前结点的下一个结点应该为该右子树的最左边的结点;如果当前结点没有右子节点,那么如果当前结点的父结点p-...
阅读全文
摘要:题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:由于头结点有可能被删除,因此需要创建新的头结点pNew;遍历链表,每遍历一个结点pCur,且pCur!=NULL,做以...
阅读全文
摘要:题目:一个链表中包含环,请找出该链表的环的入口结点。思路:1、哈希表遍历整个链表,并将链表结点存入哈希表中(这里我们使用容器set),如果遍历到某个链表结点已经在set中,那么该点即为环的入口结点;2、两个指针如果链表存在环,那么计算出环的长度n,然后准备两个指针pSlow,pFast,pFast先...
阅读全文
摘要:题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。思路:字符流:像流水一样的字符,一去不复返,意味着只能访问一次。方法1:将字符流保...
阅读全文
摘要:题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路:表示数值的字符串遵循如下模式:[sign]...
阅读全文
摘要:题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹...
阅读全文
摘要:题目:给定一个数组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]。不能使用除法。思路:方法1:直接连乘n-1个数,得到B[i];时间复杂度:O(n^2)方法2:构建前向乘积...
阅读全文
摘要:题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。思路:1、排序将数组排序,然后...
阅读全文
摘要:题目:求树中两个结点的最低公共祖先思路:考虑一下几种情况:1、该树为二叉搜索树二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个输入的结点进行比较。如果当前结点的值比两个结点的值都大,那么最低的公共父结点一定在左子树,下一步就是遍历左子树...
阅读全文
摘要:题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。思路:考虑+、-、空格、非数字字符,以及溢出问题代码:#include using namespace std;enum Status {kValid=0,kInvalid};int g_nStatus=kInvalid;long...
阅读全文
摘要:题目:写一个不能被继承的类思路:1、把构造函数设为私有函数在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的构造函数,要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。当一个类试图从它那继承的时候,必然会由于调用构造函数、析构函数而导致编译错误。但如...
阅读全文
摘要:题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:很容易想到通过位运算来解决问题。以5+17=22为例,参考十进制加法:1、只做各位相加不进位运算,即得到12,;2、做进位运算,即得到10,;3、把前面两个结果先相加,即得到22;同样二进制加法也一样:1、两个...
阅读全文
摘要:题目:求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(a?b:c)。思路:1、构造函数在类中定义静态成员变量N和sum,在构造函数中++N,sum+=N;如此一来,创建n个该类型的实例,就会调用n次构造函数,对应的静态变...
阅读全文
摘要:题目:0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。思路:1、环形链表模拟圆圈创建一个n个节点的环形链表,然后每次在这个链表中删除第m个节点;可以用std::list来模拟环形链表,list本身不是环形结构,因此每当迭代器扫...
阅读全文
摘要:题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的,2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路:把5张牌看成一个数组,就看排序后的数组是不是连续的,大小王看成特殊的数字,例如定义为0,与其他数字区分开,0的作用就是补充其他数字间不连...
阅读全文
摘要:题目:把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。思路:s可能出现的值的范围为:n--6*n1、全排列回溯法枚举n个骰子(6面)的全排列,然后计算每一次排列所有值的和,并统计该和的出现的次数,除以6^n(全排列的全部可能性),即为概率。(这里就不列出...
阅读全文
摘要:题目:字符串的左旋转操作是把字符串前面的若干字符转移到字符串的后面。请定义一个函数实现字符串左旋转操作的功能,比如:输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab";思路:这道题和翻转单词顺序很相似。思路也是一样的。第一步:翻转整个字符串"abcdefg",得...
阅读全文