剑指offer总结(C++/Java 多种解法)
文章平均质量分 86
牛客网剑指offer所有题目总结,C++与Java版本,绝对的适合小白学习的专栏。基本给出最优解与详细的解题思路。欢迎共同探讨,持续更新......
杨柳_
Java服务端研发,喜欢底层原理与基础算法设计
展开
-
【剑指offer - C++/Java】14、链表中倒数第k的节点
在线题目链接:链表中倒数第k的节点 1 题目描述 输入一个链表,输出该链表中倒数第k个结点。 2 题目分析 这道题比较简单。常规做法是先求出链表的总的节点个数n,然后再从头开始找第n-k+1个节点,这个节点就是倒数第k个节点。这种方法很好实现。 还有一种比较巧妙的解法:指定两个指针p和q指向链表头,让p先走k-1步,然后当p走了k-1步之后,q也开始从头开始往后走。那么此时p与q之间的距...原创 2018-12-19 23:11:22 · 223 阅读 · 0 评论 -
【剑指offer - C++/Java】13、调整数组顺序使奇数位于偶数前面
在线题目链接:调整数组顺序使奇数位于偶数前面 1 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 2 题目分析 2.1 方法1 这道题很简单,常规的做法是开一个数组arr,遍历两边原数组,第一遍找到所有的奇数,依次存入arr,第二遍找到所有的偶数,依次存到arr...原创 2018-12-19 22:18:49 · 339 阅读 · 0 评论 -
【剑指offer - C++/Java】12、数值的整数次方
在线题目链接:数值的整数次方 1 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 2 题目分析 2.1 方法1 循环 常规做法是直接写一个循环,让exponent个base相乘即可。这里我们主要要注意的是exponent可能小于0。所以要考虑这种情况,代码还是很好写的: 3.11 Java代码 public class...原创 2018-12-19 21:58:48 · 382 阅读 · 2 评论 -
【剑指offer - C++/Java】11、二进制中1的个数
在线题目链接:二进制中1的个数 1 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 2 题目分析 2.1 方法1 这道题看起来很简单。假设输入的整数是n。 只需要将n与1进行相与运算,看结果是不是0,然后再将n右移,再循环上述步骤直到n=0为止。看起来是这样,但是这样做存在一定的问题。 题目中明确说出n可能为负数,如果将负数右移,那么高位会被符号1填充,这就导致结果不正...原创 2018-12-19 17:22:44 · 5237 阅读 · 2 评论 -
【剑指offer - C++/Java】10、矩形覆盖
在线题目链接:矩形覆盖 1 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 2 题目分析 乍一看感觉无从下手!!!其实如果我们使用归纳方法的话,总能够总结出规律来。 假设下面是一个2*n的大矩形: 我们要使用下面这样的2*1的小矩形来填满上述的大矩形: 我们假设将2*n的矩形填满需要f(n)种方法 那么填充...原创 2018-12-19 15:37:13 · 759 阅读 · 0 评论 -
【剑指offer - C++/Java】9、变态跳台阶
题目链接:变态跳台阶 1 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 2 题目分析 假设f(n)代表青蛙跳上n级台阶的方法数。那么由于一次可以跳1级,也可以跳2级…它也可以跳n级。所以f(n)=f(n-1)+f(n-2)+…+f(1)+f(0);其中f(0)=1;根据这个式子可以写动态规划的算法 由上述公式知道: f(n...原创 2018-12-19 12:30:39 · 988 阅读 · 0 评论 -
【剑指offer - C++/Java】8、跳台阶
在线题目链接:跳台阶 1、题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 2、题目分析 首先我们定义f(n)为跳到n级台阶时需要的跳法。那么我们可以这样想:想要跳到n级台阶,只能从n-1级台阶跳上来或者从n-2级台阶跳上来。所以f(n)=f(n-1)+f(n-2),很明显。这又是斐波那契数列的公式。 只不过在这里f(...原创 2018-12-19 12:08:23 · 731 阅读 · 2 评论 -
【剑指offer - C++/Java】7、斐波那契数列
在线题目链接:斐波那契数列 1、题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 2、题目分析 有高中的数学知识,就应该知道斐波那契数列是这样的:1,1,2,3,5,8… 如果f(n)代表斐波那契数列第n项的值,那么: 既然我们已经可以得出公式了,那就很好写代码。最容易明白的就是递归了,上面的公式其实就是一个递归的...原创 2018-12-19 12:07:54 · 569 阅读 · 0 评论 -
【剑指offer - C++/Java】6、旋转数组的最小数字
题目链接:旋转数组的最小数字 1、题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 2、题目分析 从头遍历到尾找到最小值这种low的方法就不说了,是个人都会!!!...原创 2018-11-28 00:42:11 · 629 阅读 · 0 评论 -
【剑指offer - C++/Java】5、用两个栈实现队列
牛客网题目链接:用两个栈实现队列 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 1、题目分析 首先我们知道数据结构中栈与队列的特性是: 栈:数据先进后出 队列:数据先进先出 假设现在队列的两个基本操作为push与pop,两个辅助的栈为stack1与stack2。那么可以这实现队列的性质: 当我们push数据的时候,只把数据往stack1中压入...原创 2018-11-27 22:56:19 · 782 阅读 · 0 评论 -
【剑指offer - C++/Java】4、重建二叉树
牛客网题目链接:重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 1、题目分析 题目给出前序遍历和中序遍历,让重建二叉树。由前序遍历特性知前序遍历的第一个节点,肯定是根节点。那么找到了根节...原创 2018-11-14 15:53:19 · 941 阅读 · 1 评论 -
【剑指offer - C++/Java】3、从尾到头打印链表
牛客网题目链接: 从尾到头打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 本题较为简单。有两种解法:递归和使用栈循环。 1、递归解法 递归解法,也可以有两种写法。 1.1、 递归解法一 先上代码,下面给解释: java代码: import java.util.ArrayList; public class Solution { ArrayList&lt...原创 2018-11-08 20:33:27 · 814 阅读 · 0 评论 -
【剑指offer - C++/Java】2、替换空格
题目链接: 替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 注意:C++解法中,给定的字符串结尾后面还有一定的空间,不然我们还得重新给它分配足够的内存空间才能将空格换成%20。在写题过程中,我们需要判断替换后的字符串是否会超过给定的内存空间长度,超过了就直接返回。Ja...原创 2018-11-02 01:48:50 · 824 阅读 · 0 评论 -
【剑指offer - C++/Java】1、二维数组中的查找
题目链接: 二维数组中的查找 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题思路 两种思路 方法1 把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案。时间复杂度是nlogn java代码: public class So...原创 2018-11-02 01:40:18 · 888 阅读 · 0 评论