自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tianya_team

欢迎订阅公众号:IT程序员开发

  • 博客(47)
  • 收藏
  • 关注

原创 面试题39:第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。边界条件及异常:字符串为空,没有只出现一次的字符。思路:可以用hash表来存储出现的字符,然后记录出现的次数,然后按顺序查找第一个次数为1的字符,输出即可。时间复杂度:O(n)空间复杂度:O(n)当然总共有256个字符,所以可以定义大小为256的字符数组,这样空间复杂度为O(1)。

2015-12-31 15:51:41 282

原创 面试题38:丑数

题目:我们把只包含因子2,3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6,8是丑数,14不是丑数。习惯上我们把1当作第一个丑数。边界条件及异常:index小于等于0。思路:下一个丑数肯定是前面某一个丑数uglyNumbers[mult2Index]乘以2,某一个丑数uglyNumbers[mult3Index]乘以3,某一个丑数uglyNumbers[mult

2015-12-31 10:27:03 308

原创 面试题37:把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。边界条件及异常:数组为空思路:这题可以需要建立对任意两个数自己的比较规则。然后根据这个规则进行排序即可。如果是单位数,显然小的在前。如果是32和321,先比较最高位和次高位,都相同,前面的位数没有了,后面的数还有1,则将1和前面数的最高位(3)比,如果小,则后面的数(321

2015-12-30 22:38:39 287

原创 面试题36:从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,共出现了5次。边界条件及异常:n小于1思路:看了剑指offer上的思路,终于明白了。考虑n为21345,假设我们要求f(n)。1)其中f1为1出现在最高位的情况(即只考虑最高位1的个数),从10000到19999最高位共10000个

2015-12-30 22:14:30 320

原创 面试题35:连续子数组的最大和

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。边界条件及异常:空数组。思路:考虑数组2,1,-4,3,4,5,-7我们用数组DP来存子数组包括自己和自己前面元素的最大的和,则有:DP[]={2,3,-1,3,7,12,5}不难得出所有子数组最大的和是12。时间复杂度:O(

2015-12-30 20:05:54 244

原创 面试题34:最小的K个数

题目:输入n个整数,找出其中最小的K个数。边界条件及异常:n小于k,是否会有相同的数字思路:方法一:先进行排序,然后输出最小的K个数注意:会改变原来的数组时间复杂度:O(nlgn)空间复杂度:O(1)方法二:用额外的K个空间来存最小的K个数,再往后如果有小于这K个数的,按顺序插进来,并将较大的移出去。用带排序的hash表(map和set带自动排序功能

2015-12-30 15:51:04 304

原创 面试题33:数组中出现次数超过一半的数字

题目:数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。边界条件或异常:数组为空或只有一个元素,或数组中没有数字超过数组长度的一半。思路:方法一:可以先进行排序(O(nlgn))再从头到尾一次寻找超过数组长度一半的数字(O(nlgn))。注意这种方法的前提是可以改变原数组。注意排序后中间数字即是时间复杂度:O(nlgn)空间复杂度:O(1)方法二:

2015-12-30 14:33:35 347

原创 面试题32:字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。思路:题目没有说明是否有相同的字符,如果有相同的字符,请参考Permutations II本题假设没有相同的字符:方法一:递归+回溯时间复杂度:O(n!)参考leetcode 46:Permutations方法二:数学方法参考leetcode 60:Permutation Sequen

2015-12-27 19:27:46 271

原创 面试题31:二叉搜索树与双向链表

题目:输入一个二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。struct BinaryTreeNode{ int value; BinaryTreeNode *left; BinaryTreeNode *right;};思路:

2015-12-25 16:47:20 202

原创 面试题30:复杂链表的复制

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

2015-12-25 15:44:54 370

原创 函数重载

1.int Func(int,int);不可与下列哪个函数构成重载( )A.int Func(int,int,int); B.double Func(int,int);C.double Func(double,double); D.double Func(int,double);答案:B参数类型,数目不同,可以构成重载,返回类型不同不能构成重载。

2015-12-23 10:43:18 654

原创 面试题29:二叉树中和为某一值的路径

题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从数的根结点开始往下直到叶节点所经过的结点形成一条路径。

2015-12-19 15:07:10 260

原创 面试题28:二叉树搜索的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都不相同。思路:这题看清楚了,是二叉搜索树,也就是带排序的。仔细观察二叉搜索树的后序遍历,发现有下列特征:1.以最后面的一个数字为参考值,则前面一部分小于这个值,后面一部分大于这个值。2.或者前面的值全部大于或者小于这个值。我们可以用递

2015-12-19 14:32:17 402

原创 面试题27:从上往下打印二叉树

题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左往右的顺序打印。边界条件:root为空思路:这其实是广度优先算法,要用到队列。首先将root结点入队列。当队列不为空时,下面一直循环。取队列front的一个结点,输出其value,出队列。将上一步取出的结点左结点入队列,然后右结点入队列。重复上述过程。#include #include

2015-12-17 16:29:37 278

原创 面试题26:栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的可能弹出顺序。假设压入栈的所有数字均不相同。边界条件:有一个序列为空,两个序列不相等。思路:假设序列A是1,2,3,4,5,序列B是4,5,3,2,1第一步,我们定义一个栈,用来将A中数字压入栈;第二步,取B得第一个元素b1=4,和A 的第一个元素a1=1,a1和b1不相等,于是我们将a1压

2015-12-17 15:35:17 700

原创 面试题25:包含min函数的栈

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)。

2015-12-17 10:40:48 403

原创 面试题24:顺时针打印矩阵

参考:leetcode 53:Spiral Matrixleetcode 59:Spiral Matrix II

2015-12-17 10:22:50 329

原创 面试题23:二叉树的镜像

题目:请完成一个函数,输入一个二叉树,该函数输出他的镜像。边界条件:root为空。思路:二叉树的镜像其实就是所有非叶子节点的左右子树进行交换,用递归来解。时间复杂度:O(n)#include #include #include #include #include using namespace std;struct

2015-12-17 10:17:35 332

原创 面试题22:字符串包含(艺术)

题目:给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短,请问,如何最快地判断字符串B中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母。边界条件:B为空,A为空。思路:由于只包含大写英文字母,所以用hashtable来做比较简单,只需长度26的数组来存字母是否在A中出现,如果出现,就置1,否则,就置0。然后看B中所以字母

2015-12-17 08:53:04 385

原创 面试题21:旋转字符串(艺术)

题目:给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面2个字符“ab”移动字符串的尾部,使得元字符串变成“cdefab”。要求时间复杂度:O(n)空间复杂度:O(1)思路:可以利用3步反转法。第一步:将前面的字符串反转;第二步:将后面的字符串反转;第三步:将整个字符串反转。#include #include

2015-12-16 17:02:57 481

原创 面试题20:树的子结构(offer)

题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点定义如下:struct BinaryTreeNode{ int value; BinaryTreeNode *left; BinaryTreeNode *right;};边界条件:B为空,返回真。A为空,返回假。思路:1.先找到B的头结点在A中的位置,如果没找到,返回假。2.找到位置后递归进行判断

2015-12-16 16:18:59 385 1

原创 面试题19:合并两个排序的链表(offer)

题目:输入两个递增排序的链表,合并这两个链表并使新链表仍然是按照递增排序的。边界条件:两个空链表,一个空链表。两个链表只有一个结点。存在值相等的多个链表。注意资源的回收。思路:用递归来做。时间复杂度:O(min(n1,n2))#include #include #include #include #include using names

2015-12-16 15:21:13 225

原创 面试题18:反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。边界条件:head为空,只有一个结点,只有两个结点,超过3个结点。思路:可以用三个指针来指向连续地3个结点,然后让第二个指针的next指向第一个指针,在将3个指针往后移动,这样只需遍历一次链表,就可以实现链表反转。时间复杂度:O(n)#include #include #inclu

2015-12-16 15:19:28 325

原创 面试题17:链表中倒数第k个结点(offer)

题目:输入一个链表,输出该链表的第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。链表的定义如下:struct ListNode{ int value; ListNode *next; ListNode(int a){ value = a; next = NULL; }};思路:这题比较简单,先遍历链表一遍,获得链表大小。在从头开始,找到

2015-12-15 21:50:48 774

原创 面试题16:调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路:这题比较简单,用两个指针来做。时间复杂度:O(n)#include #include #include #include #include using namespace std;bool isEven(int n){ return

2015-12-15 21:09:34 271

原创 面试题15:在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点结构如下:struct ListNode{ int value; ListNode *next;};思路:这题不难,关键是能不能想到那个点上。这题关键点不是删除给定指针对应的那个结点(如果这样,必须知道其前一个结点,显然O(1)时间无法完成)。如果将后一个结点的值赋给前一个结点,然

2015-12-15 20:59:34 271

原创 面试题14:打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数,即999.思路:由于这题没有说不考虑大数,因此我们有必要用字符串来表示大数。用字符串表示最大的数没问题,关键是如何打印出所有数呢?#include #include #include #include #include using namespace std;

2015-12-15 20:17:06 382 1

原创 面试题13:数值的整数次方(offer)

题目:实现函数double Power(double base,int exponent),求base得exponent次方。不得使用库函数,同时不需要考虑大数问题。思路:如果将base乘exponent次,时间复杂度为O(n),效率不够高。由于是同一个数相乘,可以使用前面乘法获得的结果,可以使用二分法来做。时间复杂度为O(lgn)边界条件:exponent可能为负值。ba

2015-12-15 16:13:05 285

原创 面试题12:二进制中1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。思路:可以将数与0或,然后将该数右移,不断进行下去,知道变为0。但是注意如果是负数,最后不管怎么移动,最高位补的都是1,进入死循环。于是可以考虑将数与1与,然后将1左移1位,再进行与,直到这个数变为0。时间复杂度:整数32位的话需要循环32次。#include #include #include #

2015-12-15 15:25:46 357

原创 面试题11:斐波那契数列(offer)

题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:0              n=0f(n)=       1               n=1         f(n-1)+f(n-2)  n>1思路:首先大家想到的肯定是直接用递归做,非常简单,但是有大量重复的工作,效率十分低。由于要用到前面计算的结果,大家可能会想

2015-12-15 10:55:17 555

原创 面试题10:旋转数组的最小数字(offer)

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{4,5,1,2,3}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:这题跟leetcode里面的一道题目很像,那题是在旋转数组中查找对应的元素。leetcode 33:Revised Binary Search还有带重复元

2015-12-15 09:01:27 359 1

原创 面试9:时间复杂度为O(n)的排序算法

题目:实现一个排序算法,给公司年龄排序,公司几万人,要求时间复杂度为O(n),空间复杂度为常数。思路:公司年龄范围在1-100之间,所以可以用一个size为100的数组来存储每个年龄对应的人数,然后从小到大输出该年龄对应次数即可。#include #include #include #include using namespace std;void sort(vecto

2015-12-14 14:30:29 2273

原创 面试题8:用两个栈实现一个队列

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队尾插入结点和在队列头删除结点功能。templateclass CQueue{public: CQueue(void); ~CQueue(void); void appendTail(const T& node); T deleteHead();private:

2015-12-11 22:19:07 719

原创 面试题7:重建二叉树(offer)

题目:输入某二叉树的前序和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。重建后输出其头结点。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};解答:仔细观察前序遍历和中序遍历的特征,有

2015-12-11 20:21:54 277

原创 面试题6:从尾到头打印链表(offer)

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};解答:这题做出来不难,但是要以最短的时间和最优的空间却很难。这题要反向输出,可以用栈来实现,但是用栈的话,需要O(n)的空间复杂度。书中提供了一种非常好的思路(让我相当佩服),就是利用递归来实

2015-12-11 20:11:23 315

原创 面试题5:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。解答:可以先统计空格数,然后扩大字符串的size,然后从后面开始往前移动或添加字符到对应位置,用两个指针实现。时间复杂度:O(n)空间复杂度:O(1)#include #include #include using namespace std;void replace(string &str){ in

2015-12-11 19:48:13 318

原创 面试题4:堆栈内存分配

题目:编写C++中的两个类,一个只能在栈中分配空间,一个只能在堆中分配空间。解答:要写出这两个类,首先要了解堆栈分配内存情况,一个经过编译的C/C++占用的内存分为以下几个部分:1.栈区:由编译器自动分配和释放,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成的。其操作方式类似于数据结构中的栈。2.堆区:一般由程序员手动申请及释放,若程序员不释放,程序结束时可

2015-12-11 18:30:11 1700

原创 面试题3:二维数组中的查找(offer)

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。解答:每次比较有效范围(一定在原数组的左下部分)的右上角元素和target,如果等于,返回true。如果小于,有效范围的上面一行去掉。如果大于,有效范围的右面一列去掉。时间复杂度:O(n)实现如下:

2015-12-11 16:30:24 316

原创 面试题2:实现单例模式(offer)

题目:设计一个类,我们只能生成该类的一个实例。解答:单例模式的类有以下几个特征:1.构造函数是private。2.有一个唯一实例的静态指针,且是private。3.有一个public接口函数,获得该唯一实例的指针。按照上面的特征实现的单例类如下:class Singleton{public: static Singleton* getInstance();

2015-12-11 15:42:50 496

原创 面试题1:赋值运算函数(offer)

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void);private: char* m_pData;};解答:在编写赋值运算符函数时,要注意以下几

2015-12-11 14:35:21 700

空空如也

空空如也

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

TA关注的人

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