![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
yudidina
To be your own hero
展开
-
剑指offer之面试题39:数组中出现超过次数一半的数字
数组中出现次数超过一半的数字1、题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。输入参数:整型数组number[],数组长度length输出参数:返回出现次数超过length一半的数字,或者是0(即输入参数错误)2、解题解这道...原创 2020-04-27 18:09:08 · 204 阅读 · 0 评论 -
剑指offer之面试题11:旋转数组的最小数字
旋转数组的最小数字1、题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。输入参数:一维数组numbers,数组长度length输出参数:最小元素的值,或者抛出 “传入参数错误” 的异常2、解题解这道题的关键...原创 2020-04-25 22:40:31 · 150 阅读 · 0 评论 -
剑指offer之面试题4:二维数组的查找
二维数组中的查找1、题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入参数:一个二维数组matrix,数组的行数rows,数组的列数columns,寻找的整数number输出参数:返回 true 或 false2、解题解这道题的关键在于每次都选取右上角的元素。在...原创 2020-04-25 18:13:16 · 135 阅读 · 0 评论 -
剑指offer之面试题3(2):不修改数组找出重复的数字
不修改数组找出重复的数字1、题目在一个长度为 n+1 的数组里的所有数字都在 1~n 的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为 8 的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的输出是重复的数字 2 或 3。输入参数:一个整数数组numbers,数组长度length输出参数:-1(代表输入参数...原创 2020-04-25 14:03:14 · 116 阅读 · 0 评论 -
剑指offer之面试题3:数组中重复的数字
数组中重复的数字1、题目在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。输入参数:一个整数数组numbers,数组长度length,一个用于指向数组重复数字的指针du...原创 2020-04-25 13:50:55 · 140 阅读 · 1 评论 -
剑指offer之面试题52:两个链表的第一个公共节点
两个链表的第一个公共节点1、题目输入两个单向链表,找出它们的第一个公共节点。输入参数:两个链表的头指针输出结果:指向第一个公共节点的指针2、解题这道题的关键在于搞清楚两个链表在存在公共节点时的结构解这道题有三种方法。法一:蛮力法每次从链表1拿出一个节点去链表2中寻找第一个和其一样的节点时间复杂度:O(mn)法二:使用栈将两个链表的节点放入两个栈里接下来比较两个栈...原创 2020-04-13 17:04:34 · 139 阅读 · 0 评论 -
剑指offer之面试题36:二叉搜索树与双向链表
二叉搜索树与双向链表1、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的节点,只能调整树中节点指针的指向,二叉树的节点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};...原创 2020-04-13 17:03:47 · 73 阅读 · 0 评论 -
剑指offer之面试题35:复杂链表的复制
复杂链表的复制1、题目请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个m_pNext指针指向下一个节点,还有一个m_pSibling指针指向链表中的任意节点或者nullptr。节点的C++定义如下:struct ComplexListNode{ int ...原创 2020-04-13 17:02:56 · 121 阅读 · 0 评论 -
剑指offer之面试题25:合并两个排序的链表
合并两个排序的链表1、题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。输入参数:两个链表的头指针pHead1,pHead2输出节点:合并后链表的头指针pMergedHead2、解题这道题的关键在于想清楚合并链表的过程首先要考虑两个链表是否是空指针的问题,若其中一个链表为空,则返回另一个链表即可。其次链表合并的核心在于每次比较两个链表的头节点,选取值较小...原创 2020-04-13 17:01:45 · 145 阅读 · 0 评论 -
剑指offer之面试题24:反转链表
反转链表1、题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表是单向链表。输入参数:指向链表头节点的指针pHead输出结果:无2、解题解这道题的关键在于反转链表需要用到的三个指针与它们之间的逻辑因为需要反转链表,所以这三个指针是必须的:指向当前节点的指针pNode指向前一个节点的指针pPrev指向后一个节点的指针pNext在反转链表时的操作为...原创 2020-04-13 17:00:42 · 105 阅读 · 0 评论 -
剑指offer之面试题23:链表中环的入口节点
链表中环的入口节点1、题目如果个链表中包含环,如何找出环的入口节点?输入参数:一个链表的头指针pHead输出结果:链表中环的入口节点,或者是空指针2、解题这道题的关键在于链表中环的判断,以及在环存在前提下入口节点的找法首先,如何判断链表中存在一个环? 定义快慢指针,快指针每次走两步,慢指针每次走一步,若快指针出现走到了链表的末尾nullptr的情况,则说 明链表中不存在环,否则一...原创 2020-04-13 16:59:58 · 137 阅读 · 0 评论 -
剑指offer之面试题22:链表中倒数第k个节点
链表中倒数第K个节点1、题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个节点,该链表是单向链表,不存在指向前的指针。输入参数:一个指向链表头节点的指针pHead,一个无符号整数k输出结果:返回倒数第k个节点,或者返回空指针2、解题这道题的关键在于快慢指针的使用。普通思路是遍历两遍链表,第一遍获得节点个数n,然后获得倒数...原创 2020-04-13 16:58:45 · 226 阅读 · 0 评论 -
剑指offer之面试题18(2):删除链表重复的节点
删除链表重复的节点1、题目在一个排序的链表中,如何删除重复的节点?例如:删除前:1 -> 2 -> 3 -> 3-> 4 -> 4 -> 5删除后:1 -> 2 -> 5输入参数:链表的头指针输出结果:无2、解题这道题的关键在于理清 找到节点—>删除节点—>链接链表 的逻辑。因为当前链表是已排序的链表,所以可以根据前后节...原创 2020-04-13 16:57:57 · 105 阅读 · 0 评论 -
剑指offer之面试题18:删除链表的节点
删除链表的节点1、题目给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。输入参数:单向链表的头指针pHead,节点指针pToBeDeleted输出结果:无2、解题这道题的关键在于如何在时间复杂度为O(1)的情况下删除指定节点。因此,我们可以想到覆盖的方法:先获得要删除节点的下一节点,将下一节点的值赋值给删除节点,再将删除节点的指针指向下下个节点,最后删除下一...原创 2020-04-13 16:57:05 · 122 阅读 · 0 评论 -
剑指offer之面试题6:从尾到头打印链表
从尾到头打印链表1、题目输入一个链表的头节点,从尾到头反过来打印出每个节点的值。输入参数:链表的头节点输出结果:在屏幕上打印每个节点的值2、解题解这道题的关键在于 “后进先出” 的思想,因此这道题可以用栈或递归的方式解决。思路一:栈遍历链表,将节点进栈获得链表顶部的节点,打印节点值依次出栈,直到栈为空思路二:递归若当前节点不为空且下一节点不为空,不断递归下一个节点,直...原创 2020-04-13 16:56:15 · 75 阅读 · 0 评论 -
剑指offer之面试题55(2):平衡二叉树
平衡二叉树1、题目输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中的任意节点的左、右子树的深度相差不超过1,那么它就是一颗平衡二叉树。输入参数:二叉树的根节点,指向二叉树深度的int型指针输出结果:true 或者 false2、解题这道题的关键在于如何在只遍历一次二叉树的情况下,对是否是平衡二叉树进行判定由于平衡二叉树取决于左右子树的深度之差,所以我们想到使用后序遍历...原创 2020-04-13 16:54:40 · 111 阅读 · 0 评论 -
剑指offer之面试题55:二叉树的深度
二叉树的深度1、题目输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点形成树的一条路径,最长路径的长度为树的深度。输入参数:二叉树根节点输出结果:二叉树的深度2、解题这道题的关键就在于二叉树深度的判定,当一棵二叉树既有左子树,又有右子树时,该树的深度就是其左、右子树深度的较大值再加1,而当节点为空时,则代表到达了二叉树的叶子结点,代表此时的深度为0,然后依次向上递加。...原创 2020-04-13 16:51:50 · 112 阅读 · 0 评论 -
剑指offer之面试题54:二叉搜索树的第k大节点
二叉搜索树的第k大节点1、题目给定一颗二叉搜索树,请找出其中第k大的节点。**输入参数:**二叉搜索树的根节点、非负整数k**输出结果:**二叉搜索树的某个节点,或者是空指针2、解题这道题的关键在于知晓二叉搜索树的中序遍历方法,即通过中序遍历二叉树,便可以得到一个递增排序的遍历序列,这样就能很方便的得到第k大节点的值。解题的具体步骤为:鲁棒性检查,而后调用递归函数递归函数内...原创 2020-04-13 16:49:37 · 133 阅读 · 0 评论 -
剑指offer之面试题34:二叉树中和为某一值的路径
二叉树中和为某一值的路径1、题目输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。二叉树节点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};...原创 2020-04-13 16:48:58 · 125 阅读 · 0 评论 -
剑指offer之面试题33:二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列1、题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入数组的任意两个数字都不相同。输入参数:一个整数数组,数组长度输出结果:true 或者 false2、解题这道题的关键在于在只给定一个序列的前提下,如何确定左右子树之间的界限。由于题目的要求是二叉搜索树,所以这个界限的划分很简单,小于根节点的元...原创 2020-04-13 16:46:42 · 159 阅读 · 0 评论 -
剑指offer之面试题26:树的子结构
树的子结构1、题目输入两颗二叉树A和B,判断B是不是A的子结构。二叉树节点的定义如下:struct BinaryTreeNode{ double m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};输入参数:二叉树根节点1,二叉树根节点2输出结果:true 或 false2、解题此题的关键主要在于两个...原创 2020-04-13 16:45:59 · 69 阅读 · 0 评论 -
剑指offer之面试题8:二叉树的下一节点
二叉树的下一节点1、题目给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。输入参数:二叉树的一个节点输出参数:二叉树的下一个节点2、解题这道题的关键在于不同节点下一个节点的寻找方式,这里可分为两个大方向,三种寻找方式如果该节点右节点存在,那么下一个节点是右子树的最左节点如果该节点右节点不存在...原创 2020-04-13 16:43:22 · 80 阅读 · 0 评论 -
剑指offer之面试题7:重建二叉树
重建二叉树1、题目输入某二叉树的前序遍历和中序遍历序列的结果,请重建该二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字。前序遍历序列:{1,2,4,7,3,5,6,8},中序遍历序列:{4,7,2,1,5,3,8,6}输入参数:前序遍历序列、中序遍历序列、序列的长度输出结果:二叉树的根节点指针,或者为空2、解题首先,一个二叉树节点的定义如下,包括数据域和两个指向孩子节点的指...原创 2020-04-13 16:41:29 · 84 阅读 · 0 评论