![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 63
SmartBrave
这个作者很懒,什么都没留下…
展开
-
面试题1:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类添加赋值运算符函数。class CMyString{public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void);private: char* m_pData原创 2016-05-24 16:09:59 · 581 阅读 · 0 评论 -
面试题13:在O(1)时间 内删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数的定义如下:struct ListNode{ int value; ListNode* next;}void DeleteNode(ListNode* head,ListNode* pToBeDeleted);分析在单向链表中删除一个节点,通常的做法是从链表头开始遍历,如果某个节点的原创 2016-06-11 11:02:18 · 1986 阅读 · 0 评论 -
面试题14:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整数组中数字的顺序,是得所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。分析最简单的办法就是开辟和原数组同样大小的空间,顺次扫描原数组2次,第一次将所有奇数放进新数组中,第二次将偶数放入就可以。这种方法的时间复杂度为O(n),空间复杂度为O(n)。代码如下:void ReorderOddEven(vector<int>& arr){ ve原创 2016-06-11 11:02:46 · 3495 阅读 · 0 评论 -
面试题15:链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第K个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。链表的定义如下:struct ListNode{ int value; ListNode* next; ListNode(int data=int()):value(data),next(NULL) {}};分析有三种方法:递归法,自定义栈法原创 2016-06-11 11:03:08 · 954 阅读 · 0 评论 -
面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表定义如下:struct ListNode{ int value; ListNode* next; ListNode(int data=int()):value(data),next(NULL) {}};此题可以用递归和头插法来做。递归用递归做起来稍微复杂一点,而且会有个问题,就是当原创 2016-06-11 11:03:50 · 650 阅读 · 0 评论 -
面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。链表的定义如下:struct ListNode{ int value; ListNode* next; ListNode(int data=int()):value(data),next(NULL) {}};分析这是典型的链表归并问题。因为两个链表都是排好序的,所以我们只需要初始原创 2016-06-11 11:04:15 · 361 阅读 · 0 评论 -
面试题18:树的子结构
题目:输入两颗二叉树A和B,判断B是不是A的子结构。二叉树的节点定义如下:struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(int data=int()):value(data),left(NULL),right(NULL)原创 2016-06-11 11:04:40 · 343 阅读 · 0 评论 -
面试题19:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,输出它的镜像。二叉树的节点定义如下:struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(int data=int()):value(data),left(NULL),right(NULL)原创 2016-06-11 11:05:01 · 630 阅读 · 0 评论 -
面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16则依次打印出数字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.分析从题意中可以看出来,打印顺序是从左上角开始以原创 2016-06-11 11:05:25 · 787 阅读 · 0 评论 -
面试题21:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop函数的时间复杂度都是O(1)。分析栈应该是我们很熟悉的一种数据结构了,它是一种“后进先出”的数据结构,并且只能在栈的一端(栈顶)进行操作。所以其push和pop操作的时间复杂度都是O(1)。如果题目没有要求min函数的时间复杂度的话,我们可以在min函数里面遍历所有的元素并将其保存起来原创 2016-06-11 11:05:45 · 510 阅读 · 0 评论 -
面试题12:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3一直到最大的3位数即999.分析要打印1到最大的n位数,我们首先想到的方法是先计算出n,再逐次打印。但有一个很重要的问题,n大于9怎么办?(MAX_INT=2147483647,10位),这样要打印的数字就会超过整型可以表示的范围,所以说这是一个隐形的大数问题。通常都是用字符串来解决大数问题的,所以我们在字符串上来模原创 2016-06-11 11:01:56 · 492 阅读 · 0 评论 -
面试题11:数值的整数次方
题目:请实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。分析恩,很简单。我们写出的代码如下:double Power(double base,int exponent){ double res=1; int i; for(i=0;i<exponent;++i)原创 2016-06-11 11:01:19 · 350 阅读 · 0 评论 -
面试题2:实现Singleton模式
题目:设计一个类,我们只能生成该类的一个实例分析Singleton即单例模式。既然题目要求只能生成类的一个实例,那我们必须把类的构造函数和拷贝构造函数设置为private以阻止类的调用者随意创建对象。我们来看代码//单例模式类包含的数据typedef struct data{ int a; //other}data;class singleton{public: da原创 2016-05-24 16:14:47 · 480 阅读 · 0 评论 -
面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下的顺序排列。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析此题最直观的做法就是逐行逐列搜索。但这种做法没有利用数组有序递增这个特性,时间复杂度是O(m*n)(假设数组为n行m列)。肯定是不符合要求的。所以可以有两种方法:从右上角搜索和二分法。从右上角查找时,如果右上角的元素和待查找元素相原创 2016-05-24 16:15:30 · 787 阅读 · 0 评论 -
面试题4:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。分析最容易想到的办法就是从前向后扫描字符串,如果遇到空格,就把它后面的子串向后移动2个字节长度。代码如下string ReplaceBlank(string str){ int i,j; int len=str.size();原创 2016-05-24 16:17:14 · 982 阅读 · 0 评论 -
面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。分析这道题有如下几种解决方案:将链表逆置,然后顺次打印递归方案迭代方案如果逆置链表的话,会改变链表原先的结构。我们可以在面试时询问面试过是否可以改变链表,如果是肯定的回答,就可以采用这种办法。否则只能采用后面的方法。逆置链表也很简单,只需要从第二个节点开始,顺次摘取一个节点头插就可以。代码如下list* PrintListInR原创 2016-05-24 16:18:47 · 404 阅读 · 0 评论 -
面试题6:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出下图所示的二叉树并输出它的头结点。二叉树的定义如下:template<typename T>struct BinaryTreeNode{ T data; B原创 2016-05-28 22:47:34 · 319 阅读 · 0 评论 -
面试题7:用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。template<typename T>class Queue{public: Queue() {} ~Queue() {} bool appendTail(const T& t); T原创 2016-05-28 22:48:24 · 365 阅读 · 0 评论 -
面试题8:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。分析很自然地,最直观的解法就是设置一个最小值,并顺次检查数组的每一个元素,如果小于最小值,就更新这个值。最后将它输出即可。最容易想到的往往都不是最优的解法。这种算法的时间复杂度为O(n)原创 2016-05-28 22:49:12 · 410 阅读 · 0 评论 -
面试题9:斐波那契数列
题目一:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:分析根据上述公式,我们可以很容易地写出如下递归代码:long long Fib(int x){ if(x==0 || x==1) return x; return Fib(x-1,count)+Fib(x-2,count);}不过递归方式的时间复杂度是O(2^n),空间复杂度都是是O(原创 2016-05-28 22:49:59 · 612 阅读 · 0 评论 -
面试题10:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制便是中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2.分析此题考查的是对位运算的掌握,题目不是很难,但一些细节问题还是需要注意的。方法1:移位我们把这个数和0x1相与,如果结果为0,则表明该数的最后移位为0,否则为1。然后将这个数右移1位在此判断,循环32次。代码如下:int NumberOf1(int n)原创 2016-05-28 22:51:19 · 1033 阅读 · 0 评论 -
面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入序列,序列4,5,3,2,1,是该压栈序列对应的一个弹出序列。但4,3,5,1,2就不可能是该压栈序列的弹出序列。分析栈是一种“后进先出”(LIFO)的数据结构,所以元素的出进顺序都是有相对关系的。对应于题目中的例子,当入栈序列为1,2,3,4原创 2016-06-11 11:06:08 · 529 阅读 · 0 评论