牛客网《剑指Offer》66题
秋招第一步,剑指Offer刷起来。虽说网上已有好多帖子,但是不是分析不到位,就是题目不全。故再整理一波,持续更新。
Chen-FangLiang
这个作者很懒,什么都没留下…
展开
-
牛客网《剑指Offer》(1)二维数组的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题目分析 最简单的一道题目啦,遍历穷举就可以啦,两个for循环搞定,外层循环用于行遍历,内层循环用于列遍历。 class Solution { public: bool Find...原创 2019-08-29 09:31:26 · 92 阅读 · 0 评论 -
牛客网《剑指Offer》(24)二叉树中某一值的路径
题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 题目分析 此题属于典型的递归运算,最复杂的在于路径的存储,所以需要引入全局变量,防止值被覆盖。大致思路如下: 1、递归跳出条件:找见符合路径:累计和等于输入值,左右子节点均为空。...原创 2019-09-06 16:19:59 · 89 阅读 · 0 评论 -
牛客网《剑指Offer》(23)二叉线索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 题目分析 线索二叉树的特征:左子树小于根节点,右子树大于根节点。 后序遍历:左子树、右子树、根节点。 解题思路: 1、找到根节点所在索引位置,区分左右子树。 2、判断索引后的元素是否都大于更节点。 3、分别递归判断左右子树。 cl...原创 2019-09-02 00:09:16 · 110 阅读 · 0 评论 -
牛客网《剑指Offer》(15)反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 题目分析 链表的转置是一个很常见、很基础的数据结构题了,非递归的算法很简单,用三个临时指针 pre、head、next 在链表上循环一遍即可。递归算法也是比较简单的,但是如果思路不清晰估计一时半会儿也写不出来吧。 /* struct ListNode { int val; struct ListNode *next; List...原创 2019-09-02 00:09:26 · 86 阅读 · 0 评论 -
牛客网《剑指Offer》(14)链表中倒数第k个节点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 题目分析 链表的特征就是修改方便,查找复杂,不支持随机查找,更何况倒数第k个节点,除非是双向链表。 此题解题其实是有一定技巧的,我们使用快慢指针来实现。同样类似的问题还有好多,我们先解题,下文会列出所有类似问题。 1、设立两个指针(快指针与慢指针),都指向链表头部。 2、将快指针前移k个位置。 3、同时移动快慢指针,当快指针移到链...原创 2019-09-01 21:18:10 · 150 阅读 · 0 评论 -
牛客网《剑指Offer》(13)调整数组奇偶数顺序
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 题目分析 题目不难,最简单的方法,将顺序查找奇数与偶数,分别放到不同的数组中,再拼接到同一个数组中就可以了。 class Solution { public: void reOrderArray(vec...原创 2019-09-01 20:38:30 · 99 阅读 · 0 评论 -
牛客网《剑指Offer》(12)数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 题目分析 此题就没什么意思了,随便写写,最简单的方法是直接调用pow()函数,或者手写一个pow()函数,估计作者的意图是让手写吧。 一、直接调用 class Solution { public: double P...原创 2019-09-01 20:31:43 · 65 阅读 · 0 评论 -
牛客网《剑指Offer》(11)二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 题目分析 提到进制转换相关问题,应该第一时间想到两种方法:1、逻辑运算,2移位操作。 第一种方法:将该二进制数各位依次与“1”进行与操作,统计结果为true的个数。 class Solution { public: int NumberOf1(int n) { unsigned in...原创 2019-09-01 20:22:53 · 85 阅读 · 0 评论 -
牛客网《剑指Offer》(10)矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题目分析 看似没有头绪,画个图就明白了,还是跳台阶问题。 f(1) = 1,f(2) = 2,f(n) = f(n-1) + f(n-2) class Solution { public: int rectCover(int numbe...原创 2019-09-01 20:07:06 · 84 阅读 · 0 评论 -
牛客网《剑指Offer》(9)变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题目分析 乍一眼看上去,此题好像不能使用之前的分析方法了,那么换个思路,从后往前不行,那就从前往后。 f(1) = 1 f(2) = 1+ f(1) ...... f(n-1) = 1+f(1) +f(2) +...+ f(n-2) ...原创 2019-09-01 19:58:50 · 99 阅读 · 0 评论 -
牛客网《剑指Offer》(8)跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 题目分析 此题其实和前一题相似,首先分析一下。假设共有10级台阶,且10级台阶的跳法为f(10)。那么就有以下两种场景: 1、最后一次跳了两级:第八级直接跳到第十级。 2、最后一次跳了一级:第九级直接跳到第十级 即f(10) = f(8) + f(9),这不...原创 2019-09-01 19:39:46 · 73 阅读 · 0 评论 -
牛客网《剑指Offer》(7)斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 题目分析 首先理解什么是斐波那契数列:即f(1) = 1 ,f(2) = 1,f(n) = f(n-1) +f(n-2) 同样,实现方法也有两种:1、自底向上实现,2、递归实现 方法一:自底向上实现 class Solution { public: ...原创 2019-09-01 19:31:50 · 147 阅读 · 0 评论 -
牛客网《剑指Offer》(6)旋转数组的最小元素
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 题目分析: 仔细分析,不难发现,这是一道查找数组最小元素的题目,两种方法:1、遍历查找,2、二分查找 方法一...原创 2019-09-01 19:08:48 · 106 阅读 · 1 评论 -
牛客网《剑指Offer》(5)用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 题目分析 此题关键在于理解这两种数据结构的特点: 栈:先进后出。队列:先进先出。 实现-Push:直接入栈1 实现-Pop:分几步执行 1、将栈1元素复制到栈2,实现反转。 2、栈2的栈顶元素出栈,该元素就是输入的第一个元素。 3、将栈2元素复制到栈1,此时栈1...原创 2019-08-30 17:10:53 · 70 阅读 · 0 评论 -
牛客网《剑指Offer》(4)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 题目分析 本题有一定难度,首先需要先弄清楚各种遍历的原理: 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点...原创 2019-08-29 10:11:36 · 78 阅读 · 0 评论 -
牛客网《剑指Offer》(3)从尾到头打印链表
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 题目分析 链表反转一般有三种方法:1、递归;2、栈;3、节点替换。 下面介绍前两种方法,第三种方法后面还有一道链表反转的题,在那详细介绍。 1、递归 /** * struct ListNode { * int val; * struct ListNode *next; * ...原创 2019-08-29 09:59:47 · 88 阅读 · 0 评论 -
牛客网《剑指Offer》(2)替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 题目分析 此题也比较简单,目前有两种方法解决: 1、字符串拼接 class Solution { public: void replaceSpace(char *str,int length) { /...原创 2019-08-29 09:52:39 · 71 阅读 · 0 评论 -
牛客网《剑指Offer》(25) 复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 题目分析 复杂问题简单化,将该问题拆分成三步来实现,就简单多了。 1、遍历链表,复制链表中的每个结点,并将复制的结点插入到该结点的后面。例如,原链表为A->B-...原创 2019-09-06 21:47:03 · 90 阅读 · 0 评论