![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
zy20150613
这个作者很懒,什么都没留下…
展开
-
剑指offer:矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的...原创 2019-06-04 22:00:13 · 173 阅读 · 0 评论 -
剑指offer:二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析:递归,一棵二叉树的高度等于1+max{左子树高度,右子树高度} int TreeDepth(TreeNode* pRoot) { if(pRoot==nullptr) return 0; ...原创 2019-05-21 08:34:30 · 124 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。分析:方法(1):从头开始遍历统计等于k的元素的个数方法(2):利用stl库中的函数equal_range,它返回一对迭代器(以pair的形式),这对迭代器之间的元素都是k,左闭右开方法(3):二分查找(找到从前往后第一个k下标,从后往前第一个下标即可)int GetNumberOfK(vector<int> data...原创 2019-05-21 08:33:50 · 139 阅读 · 0 评论 -
剑指offer:两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。分析:先计算两个链表长度,让长的那个先走差距步,然后一起走,相遇时就是答案。ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1==nullptr || pHead2==nullptr) return...原创 2019-05-21 08:24:50 · 133 阅读 · 0 评论 -
剑指offer:数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size<=...原创 2019-05-21 08:24:00 · 130 阅读 · 0 评论 -
剑指offer:第一个只出现一次的字符
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).分析:方法(1):用一个数组count,记录每个字母出现的次数,最后遍历字符串,看看其对应的次数是不是1,满足找第一次出现1次的字母。int FirstNotRepeatingChar(string str) {...原创 2019-05-21 08:17:08 · 122 阅读 · 0 评论 -
剑指offer:丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析:首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘...原创 2019-05-21 08:16:15 · 108 阅读 · 0 评论 -
组队竞赛
题目:链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b?orderByHotValue=1&page=1&onlyReference=false来源:牛客网牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组...原创 2019-05-21 08:04:04 · 170 阅读 · 0 评论 -
剑指offer:二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ /...原创 2019-05-11 22:00:26 · 92 阅读 · 0 评论 -
剑指offer:树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析:先看B是不是以A的根结点为根结点的子树,是的话直接返回true,否则看是不是以A的左子树为根结点的子树,再看右子树这是一个递归的过程。//判断node2是不是以node1的根结点为根结点的子树 bool is_subtree(TreeNode* node1, TreeNode* ...原创 2019-05-10 16:39:17 · 73 阅读 · 0 评论 -
剑指offer:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。分析:对vector容器内的数据进行按照 将a和b转为string后 若 a+b<b+a a排在在前 的规则排序,如 2 21 因为 212 < 221 所以 排序后为 21 2 ,排序后数组中的元素...原创 2019-05-10 16:38:30 · 105 阅读 · 0 评论 -
剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。分析:先求出一个整除中有多少个1(模10除10的方式),然后循环看某个非负整...原创 2019-05-10 16:37:51 · 85 阅读 · 0 评论 -
剑指offer:求1+2+3+...+n
题目:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。分析:利用构造函数、静态变量求解。class Sum { private: static int n; static int sum; public: static void R...原创 2019-05-21 08:35:08 · 129 阅读 · 0 评论 -
剑指offer:数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析:方法(1):先遍历一遍数组,计算出所有元素亦或结果sum,按照sum是1的比特位将原数组分成2组,那两个单独的数组必然被分到两组,因为是他俩不同的比特位才造成sum的1的,然后亦或其中一组找到其中一个数组n1,然后用sum亦或这个n1得到n2。void FindNumsAppear...原创 2019-05-21 08:36:37 · 104 阅读 · 0 评论 -
剑指offer:二叉树中和为某一值的路径
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)//全局变量 vector<vector<int>> res;//保存最终结果 vector<int> path;//保存每一次的路径...原创 2019-06-04 16:50:57 · 118 阅读 · 0 评论 -
剑指offer:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向分析:中序遍历并将遍历顺序的结点存起来,最后遍历添加每个指针的前后指针域即可。vector<TreeNode*> nodes; //中序遍历(将结点指针尾插在vector中) void tranverse(TreeNode* pRoot) {...原创 2019-06-04 16:50:13 · 115 阅读 · 0 评论 -
[编程题]进制转换
链接:https://www.nowcoder.com/questionTerminal/ac61207721a34b74b06597fe6eb67c52来源:牛客网[编程题]进制转换热度指数:20634 时间限制:1秒 空间限制:32768K给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数输入描述:输入为一行,M(32位整数)、N(2 ≤ N ≤ 16...原创 2019-05-23 12:25:20 · 1810 阅读 · 0 评论 -
[编程题]计算糖果
链接:https://www.nowcoder.com/questionTerminal/02d8d42b197646a5bbd0a98785bb3a34来源:牛客网A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.现在需...原创 2019-05-23 12:20:50 · 267 阅读 · 0 评论 -
[编程题]字符串中找出连续最长的数字串
链接:https://www.nowcoder.com/questionTerminal/bd891093881d4ddf9e56e7cc8416562d?orderByHotValue=0&page=1&onlyReference=false来源:牛客网读入一个字符串str,输出字符串str中的连续最长的数字串输入描述:个测试输入包含1个测试用例,一个字符串str...原创 2019-05-22 11:29:44 · 770 阅读 · 0 评论 -
C++中类成员函数中的this指针
先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解...原创 2019-05-12 20:50:39 · 8129 阅读 · 0 评论 -
C++中构造函数详解
一、 构造函数是干什么的class Counter{public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; }private: // 数据成员 ...原创 2019-05-12 20:47:28 · 173 阅读 · 0 评论 -
C/C++中struct和class的区别
C语言中只有struct,是指结构体,是由结构体名,结构体成员构成。C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数吗?能!struct能继承吗?能!!struct能实现多态吗?能!!!最本质的一个区别就是默认的...原创 2019-05-12 20:42:30 · 2261 阅读 · 0 评论 -
剑指offer:和为S的连续正数序列
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出:所有和为S的连续正数序列。序列内按照从小...原创 2019-05-21 08:37:43 · 113 阅读 · 0 评论 -
剑指offer:连续子数组的最大和
题目:连续子数组的最大和。HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它...原创 2019-05-10 16:37:13 · 79 阅读 · 0 评论 -
剑指offer:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。分析:方法(1):排序(升序),找前k个数据vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { //在n个数中找最小的前k个数(排序) ...原创 2019-05-10 16:36:29 · 558 阅读 · 0 评论 -
剑指offer:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数...原创 2019-05-10 16:34:57 · 641 阅读 · 0 评论 -
剑指offer:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。分析:斐波那契数列问题,但是注意初值 int jumpFloor(int number) { //1级有1种,2级有2种,3级有3种,4级有5种 if(number==1) return 1;...原创 2019-05-06 15:18:33 · 140 阅读 · 0 评论 -
剑指offer:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析:非减排序的数组,就相当于是递增排序数组“”方法(1):直接遍历,找到最小值。方法(2):由于旋转后,...原创 2019-05-06 15:17:47 · 1071 阅读 · 0 评论 -
剑指offer:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析:先拿着前序的根,去中序中数组中,找到以这个根为一棵树的左右子树,然后将左子树的前序、中序找出来存在两个vector中,去构建左子树;将右子树的前序、...原创 2019-05-06 15:16:30 · 292 阅读 · 0 评论 -
剑指offer:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析:确定stack1为入栈,stack2为出栈(即入数据永远都往stack1中入,出数据永远都从stack2中出,但是当stack2为空时,出数据得从stack1中倒数据),因为将栈中的元素倒一遍就将数据倒序了,就可以达到队列的效果。class Deque{void push(int no...原创 2019-05-06 15:15:09 · 138 阅读 · 0 评论 -
剑指offer:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。分析:先将链表数据尾插到一个vector中,再将这个vector反转。(当然也可以头插) vector<int> printListFromTailToHead(ListNode* head) { ListNode* cur=head; vector<...原创 2019-05-06 15:13:36 · 81 阅读 · 0 评论 -
剑指offer:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:从第一行最后一个数开始查找,要找的数大于这个数,则当前列不变,行加加;要找的数小于这个数,当前行不变,列减减;否则说明找到了。bool Find(int target, vector&l...原创 2019-05-06 15:12:41 · 187 阅读 · 0 评论 -
剑指offer:输入两个整数序列,第一个是压栈序列,请判断第二个序列是否为出栈序列
题目:输入两个整数序列,第一个是压栈序列,请判断第二个序列是否为出栈序列。假设压入栈的所有元素不相等。分析:模拟它的入栈过程,看看能不能有这样的出栈序列(借助辅助栈)bool is_valid_order(vector<int>& push, vector<int>& pop){ stack<int> s; int pushind...原创 2019-05-06 15:11:38 · 136 阅读 · 0 评论 -
剑指offer:求1+2+...+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字以及判断语句
题目:求1+2+...+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字以及判断语句分析:方法(1):利用构造函数。我们定义一个类,类中定义两个静态成员变量,让构造函数里面操作这两个静态的成员变量,然后创建n个对象,即可完成我们想要的。方法(2):利用虚函数。模拟递归,但是出口条件不能用条件语句判断,我们用两个函数来模拟(一个模拟继续递归,一个...原创 2019-05-06 15:10:46 · 111 阅读 · 0 评论 -
剑指offer:数组中有一个数字出现的次数超过数组的一半,请找出这个数字。
方法(1):用一个count数组记录数组中元素出现的次数(哪个数字出现了,将以这个数字为下标的count数组元素加1,也可以优化以下,即空间开max-min+1这么大,即如果最小的元素出现了,将count下标为0的元素加1,但是当原数组元素范围很大时,这种方法还是比较坑爹).当然这个可以优化到直接用map,元素与次数的映射,而不是自己去统计。方法(2):可以将数组进行排序,排好序后,中间那个数...原创 2019-05-06 15:08:53 · 280 阅读 · 0 评论 -
剑指offer:数组中的重复数字
题目:数组中的重复数字。在一个长度为n的数组里所有的数字都在0~n-1范围,数组中某些数字是重复的,但是不知道有几个数字重复了,请找出数组中任意一个重复的数字。例如:长度为7的数组[2,3,1,2,5,3],重复的数字是2或者3。分析:方法(1):用两层for循环,拿着每一个数据与剩下的每一个比较,看看有没有再次出现时间复杂度O(n*n)(参数中ret是返回型参数,带回那个找找到的重复数)...原创 2019-05-06 15:07:50 · 77 阅读 · 0 评论 -
剑指offer:二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。算法思想:方法一: 按行列遍历整个数组,若找到,则返回真, 若找不到,返回假。 算法时间复杂度(O(n平方))。方法二: 因为数组是每行从左到右递增顺序排序,每列...原创 2019-04-29 12:16:52 · 68 阅读 · 0 评论 -
剑指offer:输入一个整数n,请你输出斐波那契数列的第n项
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39分析:方法(1):可以用数组将每个斐波那契数列值存起来int Fibonacci(int n){ int a[40] = { 0 }; a[0] = 0; a[1] = 1; for (int i = 2; i <= 39; i++) ...原创 2019-05-07 19:37:29 · 683 阅读 · 0 评论 -
剑指offer:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析:这其实是斐波那契数列问题,如下:int rectCover(int number) { //也是斐波那契数列,n==1时1种,n==2时2种,n==3时3种...f(n)=f(n-1)+f(n-2) if(number==...原创 2019-05-07 19:39:50 · 1470 阅读 · 0 评论 -
剑指offer:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析:分为三步走:(1)给原来的链表的每个结点复制一个新节点并且插入到对应的后面 (2)利用老节点将新节点的random指针域置好 (3)将链表还原,即拆成完整的两个链表...原创 2019-05-10 16:34:13 · 302 阅读 · 0 评论