![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
剑指offer面试题记录实现
我是方小磊
这个作者很懒,什么都没留下…
展开
-
剑指Offer:面试题18(二)——删除链表中重复的节点(java)
文章目录删除链表中重复的节点题目描述算法思路算法实现(一)算法实现(二)删除链表中重复的节点题目描述在一个排好序的单向链表中,删除所有重复的节点例如:1->1->1->2->3->3->3->4->5->5算法删除之后变成 2->4算法思路算法思路其实很清晰,当遇到前后两个节点相同的情况下,例如 2->3->3->3->4,找到所有的3节点,将中间的三个节点进行删除(其实就是断链再连),最终变成 2-&原创 2020-07-23 20:57:08 · 185 阅读 · 0 评论 -
剑指Offer18:面试题18——删除链表的节点(java)
删除链表的节点问题描述算法思路一(时间O(n))这种算法也就是我们最常见的算法,删除一个节点的时候首先找到被删除节点(deleteNode)之前的节点(p)直接让 p.next = deleteNode.next 即可所以这种算法首先要遍历链表,时间复杂度为O(n)/** * O(n) * @param head * @param deleteNode * @return */ public static ListNode dele原创 2020-07-07 16:14:02 · 151 阅读 · 0 评论 -
剑指Offer:面试题17——打印从1到最大的n位数(java)
打印从1到最大的n位数问题描述问题分析首先这道题肯定是不会让你用最简单的循环去做的,但是为什么不能用循环呢?因为这道题并没有说不考虑大数的限制,也就是说使用int或者long可能会导致溢出所以对于大数的情况,我们一般都是用字符数组去模拟数字的加法,这就是算法思路一其次就是可以把问题转化为数字的全排列问题,无非就是对定长的字符数组,每一位都可能取0-9,进行全排列,这样的思路是最优的,但是我没怎么看懂代码实现!算法思路一:字符数组模拟输入n,使用n+1位的字符数组模拟存储,并且同时进行原创 2020-07-01 11:17:00 · 229 阅读 · 0 评论 -
剑指Offer:面试题16——数值的整数次方(java)
文章目录数值的整数次方问题描述算法思路一(简单循环)算法思路二(递归)总结数值的整数次方问题描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。算法思路一(简单循环)此类题目大部分人都有一个较为清楚简单的解法思路,那就是简单一个循环即可实现,但是实际上在书写的时候需要考虑一些边界情况甚至是输入参数的合法性,这个是容易忽略的首要要单独考虑exponent = 0 的情况其次要原创 2020-06-28 16:01:09 · 138 阅读 · 0 评论 -
剑指Offer:面试题15——二进制中1的个数(java)
文章目录二进制中1的个数1. 题目描述2. 前提知识补充2. 1 位运算规律2.2 左移右移运算2.3 位运算的实质3. 算法思路一3.1 除法3.2 位运算3.3 算法漏洞4.算法思路二5. 算法思路三(最优解法)二进制中1的个数1. 题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。2. 前提知识补充2. 1 位运算规律2.2 左移右移运算左移运算 m << n 就是将原数据 m 的左边去掉n位,在右边补上n个零即可0110010 <&原创 2020-06-19 10:39:46 · 188 阅读 · 0 评论 -
剑指Offer:面试题14——剪绳子(java)
剪绳子问题问题描述给定一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]* k[1] * … *k[m]可能的最大乘积是多少?例如长度为8的绳子,可以剪成2,3,3段,最大乘积为18。问题混淆我个人认为这道题题目有很强的混淆性,在我第一次做的时候,我认为该题目应该有两个输入,分别为n,m,也就是说要将定长 n 的绳子分为 m 段,求最大乘积。但是在标准答案中,题目丝毫没有提及 m 这个参数,原创 2020-06-18 09:47:27 · 233 阅读 · 0 评论 -
剑指Offer:面试题13——机器人的运动范围(java)
机器人的运动范围题目描述算法思路其实算法思路很明确,只要从【0】【0】开始进行四个方向的搜索即可,这也是回溯问题当机器人需要进入【i】【j】的时候,首先判断是否可以进入,如果不符合,那就返回 0如果符合,那就返回 1 + M1 + M2 + M3 + M4M1,M2,M3,M4 是指四个方向搜索可以到达的格子个数所以这就是一个递归的写法算法实现这里在实现回溯的时候遇见了困难,由于对递归的不熟悉,不知道到底返回什么?其实很简单,如果该位置符合,那么返回值至少为1,还要原创 2020-06-16 10:56:59 · 141 阅读 · 0 评论 -
剑指Offer:面试题12——矩阵中的路径(java)
矩阵中的路径题目描述:算法思路这道题其实类似于图的搜索,但是不同的是每次搜索之后并不能确定下一次的搜索方向,并且每次搜索都需要将所有的方向进行前进,如果不行就要进行往回走,也称之为回溯。样例搜索过程: 样例输入:“b f c e” 我们这里设定搜索方向依次为 上下左右首先我们从N【0】【0】 = a 开始搜索,发现a 不等于 b ,那么就换一个开始搜索的地方从N【0】【1】 = b 开始搜索,发现b等于第一个字符 那么继续搜索:首先从b往上走,很明显往上走越界了,那么原创 2020-06-15 17:50:26 · 153 阅读 · 0 评论 -
剑指Offer:面试题11——旋转数组的最小数字(java)
旋转数组的最小数字问题描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。算法思路一:遍历其实很简单,直接遍历该数组即可,就可以找到最小值,时间复杂度为O(n)但是实际上面试题中出现这种题肯定不会让你用这种方法,所以要优化解法算法思路二:二分查找首先这道题是类似于数组的查找问题,实际上数组的查找一般来说最快的就是二分查原创 2020-06-10 18:10:53 · 214 阅读 · 0 评论 -
剑指Offer:面试题10——斐波那契数列相关问题(java)
斐波那契数列问题问题描述斐波那契数列为 1,1,2,3,5,8。。。。。输入n,请求出第n个数的值算法思想:其实很简单我们首先找到斐波那契数列的递推公式 F(n) = F(n - 1)+ F(n - 2)所以我们可以很容易的想到使用递归来实现问题,递归树如下:但是实际上我们发现其中有很多计算节点都是重复的,所以使用递归的话是一种效率极其低下的实现方法。要解决效率低下的问题,就要知道是哪里出现了效率低,我们可以发现是由于计算重复的问题,所以我们要朝这个方向去解决问题。其实要解决也很容原创 2020-06-10 07:45:52 · 185 阅读 · 0 评论 -
剑指Offer:面试题09——用两个栈实现队列(java)
用两个栈实现队列问题描述用两个栈实现队列的数据结构(先进先出)算法思想要利用两个先入后出的栈去实现一个先入先出的队列,首先我们要明白的就是入队列和出队列肯定是使用两个不同的栈。说明两个栈一个是实现入队列的,一个是实现出队列的。那我们就一步步的来观察:假设定义 input 栈和 output 栈两个栈1. 入队abc三个元素:就放入input栈中, 此时intput中有【a,b,c】(这时候不要管output栈,因为还没有到输出的时候,往往这时候去思考output就会打乱思绪)2.原创 2020-06-08 19:49:41 · 366 阅读 · 0 评论 -
剑指Offer:面试题08——二叉树的下一个节点(java)
二叉树的下一个节点题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。输入为一个节点,输出为该节点的下一个节点思路:首要要明白中序遍历的顺序:左根右要找到一个Node节点中序遍历的下一个节点,要根据输入的节点类型来判断:分为两种情况Node节点有右子树:这种情况下一个节点就是右子树中序遍历的第一个节点。所以只需要从Node节点的右孩子出发,一直向左遍历到顶,就是中序遍历的第一个节原创 2020-06-05 16:10:22 · 133 阅读 · 0 评论 -
剑指Offer:面试题07——重建二叉树(java)
重建二叉树题目描述给出一个二叉树的前序遍历和中序遍历,请重建该二叉树,返回根节点样例输入:前序 {1,2,4,7,3,5,6,8};中序 {4,7,2,1,5,3,8,6};算法思路首先要明白前序和中序遍历的顺序:前序遍历:根左右中序遍历:左根右也就是说前序遍历的第一个节点就是树的根节点中序遍历根节点左边的节点全在左子树上,右边的节点全在右子树上算法过程:前序pre【】 {1,2,4,7,3,5,6,8};中序 mid【】 {4,7,2,原创 2020-06-04 18:18:02 · 154 阅读 · 0 评论 -
剑指Offer:面试题06——从尾到头打印链表(java)
从尾到头打印链表1. 问题描述给一个单向链表,请头尾到头进行打印数据2. 算法思路思路一:定义一个ArrayList(动态数组),遍历链表进行存储,然后倒序输出但是我们可以想一下,其实我们无非就是用一块内存进行存储,先存储的最后进行输出,那么先进后出的顺序不就是栈的数据结构吗?所以我们立马就可以想到用栈去做‘’思路二: 定义一个Stack(栈),遍历链表进行压栈,最后进行出栈我们既然想到了用栈,那么其实就要往递归的方向去思考了,因为递归和栈的思路都是通的,大部分用栈解决的问题原创 2020-06-02 13:19:03 · 205 阅读 · 0 评论 -
剑指Offer:面试题05——替换空格(java,c)
替换空格问题描述:请实现一个函数,将一个字符串中的所有空格替换成“%20”这道题其实本身没有说清楚是针对于字符串还是针对于字符串数组,所以这里分类进行讨论算法思路一:如果是字符串,对于java语言来说,这道题有一个非常容易的解法,那就是直接使用String类的replaceAll方法,但是实际上面试算法都是考查能力的,不会让你直接用接口写但是我们可以自己去实现replaceAll中的源码来回答这个问题,用StringBuild,只需要遍历该字符串,根据题目要求构建返回一个新的字符串即可!原创 2020-05-29 13:48:23 · 124 阅读 · 0 评论 -
剑指Offer:面试题04——二维数组的查找(java)
二维数组的查找题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目难点:首先暴力算法就不要想了,面试不可能回答出这种想法其实很明显这是一个类似于图的深度搜索的问题,我们如果从nums【0】【0】开始查找,那么就分为三种情况如果target = nums【i】【j】,那么进行输出如果target > nums【i】【j】,则数据可能在nums【i】原创 2020-05-27 18:34:49 · 160 阅读 · 0 评论 -
剑指Offer:面试题03——数组中重复的数字(java)
题目描述:题目一:寻找数组重复的数字在一个长度为n的数组里面所有的数字都在0——n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出重复的数字为2或者3.题目二:不能修改输入的数组,寻找数组重复的数字在一个长度为n+1的数组里面所有的数字都在1——n的范围内。数组中某些数字是重复的。请找出数组中任意一个重复的数字。例如,如果输入长度为8的数组{2原创 2020-05-26 18:40:02 · 171 阅读 · 0 评论