剑指Offer
持续更新每一道剑指Offer编程题的解题思路与代码,每道题目大都不只一种解法,本专栏也在力求找到更优雅,更高效的解法。偶尔某道题会带有对解题过程的一些总结,或是一点想法。
坏坏也童鞋
编程爱好者
展开
-
【剑指Offer】反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用next保存当前节点的下一个节点,然后将当前节点的下一个节点指向last,实现反转 如下图所示 实现代码 public ListNode ReverseList(ListNode pHead) { ...原创 2020-04-26 20:06:44 · 234 阅读 · 0 评论 -
【剑指Offer】链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数第k个结点 如下图所示 实现代码 public ListNode FindKthToTail(ListNode head, int k) { ListNode p = head, q = n...原创 2020-04-26 20:05:25 · 161 阅读 · 0 评论 -
【剑指Offer】数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 解法1 最直接的思路,计算base的exponent次方,则将base连乘exponent次即可,时间复杂度为O(exponent) 但是要注意处理特殊情况: 如果底数base等于0则直接返回0 非0数的0次方等于1 当指数为负数时的...原创 2020-04-22 18:50:18 · 252 阅读 · 0 评论 -
【剑指Offer】调整数组顺序使奇数位于偶数前面
文章目录题目描述解法1实现代码解法2实现代码解法3实现代码 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 解法1 最直接的思路是再构建一个新数组,先遍历一遍原数组,把其中的奇数依次添加到新数组中,再遍历一遍原数组把其中的偶数依次添加到新数组中,时间复杂度为O(2n)...原创 2019-06-25 23:24:16 · 179 阅读 · 0 评论 -
【剑指Offer】二进制中1的个数
文章目录题目描述补码解法1实现代码解法2实现代码 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 补码 解题前,我们先来了解一下补码。在计算机系统中,数值都是用补码来表示和存储的。 而原码就是数值的二进制数表示,最高位1表示负数。 以32位数值举例 1的原码就是 -1的原码就是 正数的补码等于原码 负数的补码等于其原码按位取反后(除了最高位)加1,比如-1的补码就是...原创 2019-06-20 13:36:26 · 200 阅读 · 0 评论 -
【剑指Offer】矩形覆盖
文章目录题目描述解法1实现代码解法2实现代码解法3实现代码 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解法1 一开始尝试解这道题的时候其实有些不知道怎么下手,花了很长时间。后来发现可以利用递归的思想,将n的值不断放小到某个可以直接知道结果的值。虽然直接实现递归的算法可能效率不高,但在找到题目的递归解法...原创 2019-06-11 23:27:31 · 171 阅读 · 0 评论 -
【剑指Offer】变态跳台阶
文章目录题目描述解法1实现代码解法2实现代码解法3实现代码 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解法1 本题是【剑指Offer】跳台阶的进化版本。 原来的青蛙只可以跳上1级或2级,即F(n) = F(n - 1) + F(n - 2) 现在的青蛙可以跳上1到n的任意级,按照之前的解题思路,依然先来看F(n),对于...原创 2019-05-04 01:52:22 · 188 阅读 · 0 评论 -
【剑指Offer】跳台阶
文章目录题目描述解法1实现代码排列组合解法2实现代码 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 解法1 首先对这道题,我们可以通过找规律来解 一只青蛙可以跳上1级台阶,也可以跳上2两级台阶 当n = 1时,有1种跳法 当n = 2时,有2种跳法 当n = 3时,有3种跳法 当n = 4时,有5种跳法 当n = ...原创 2019-04-25 17:22:26 · 357 阅读 · 0 评论 -
【剑指Offer】斐波那契数列
文章目录题目描述解法1 递归实现代码解法2 动态规划实现代码动态规划解法3矩阵的快速幂实现代码 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 解法1 递归 解题前先简单说明一下斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称...原创 2019-04-19 13:43:23 · 624 阅读 · 0 评论 -
【剑指Offer】旋转数组的最小数字
文章目录题目描述解法1实现代码二分查找解法2实现代码一点想法 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解法1 对于非减数组来说,数组右边的元素一定大于等...原创 2019-04-16 21:30:41 · 232 阅读 · 0 评论 -
【剑指Offer】用两个栈实现队列
文章目录题目描述栈和队列解法实现代码 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 栈和队列 解题前我们先来了解下什么是栈和队列 栈是限制插入和删除只能在一个位置上进行的表,是后进先出表,比如,在栈中依次插入1,2,3,4(由栈顶插入),如下图所示。由于栈是限制只能在一个位置上进行操作,所以删除(弹出)也只能在栈顶进行,即弹出顺序为4,3,2,1。...原创 2019-04-14 13:43:48 · 200 阅读 · 0 评论 -
【剑指Offer】重建二叉树
剑指Offer 文章目录题目描述二叉树的前序中序后序遍历前序遍历过程中序遍历过程后序遍历过程解法1实现代码解法2实现代码遇到的问题 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 二叉树的前序中序后序...原创 2019-04-13 13:52:51 · 218 阅读 · 0 评论 -
【剑指Offer】从尾到头打印链表
剑指Offer 从尾到头打印链表题目描述解法1实现代码一点补充 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 解法1 这道题主要思路是while循环从头遍历整个列表,将每个元素插入到List中,因为要求是从尾到头,所以每次插入时利用Insert函数不断将元素插入到第一的位置 实现代码 public class ListNode { public int val...原创 2019-04-07 01:29:11 · 162 阅读 · 0 评论 -
【剑指Offer】替换空格
剑指Offer 替换空格题目描述解法1实现代码解法2实现代码 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解法1 这道题比较简单,就是遍历该字符串每一个字符进行复制,遇到空格就复制成%20。或者你也可以直接用C#自带的Replace函数,那这道题也就完全没有意义了。 实现代...原创 2019-04-07 00:41:51 · 201 阅读 · 0 评论 -
【剑指Offer】二维数组中的查找
剑指Offer 二维数组中的查找题目描述解法1实现代码需注意的问题解法2实现代码 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解法1 最简单的思路,就是暴力遍历,for循环遍历数组所有元素,判断该整数是否存在。再利用题目给出的每一行递增,每...原创 2019-04-06 14:35:58 · 138 阅读 · 0 评论