![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
可爱组长
这个作者很懒,什么都没留下…
展开
-
剑指offer-两个排序数组组合成一个更大的数组
剑指offer中的-将两个排序数组组合成一个更大的数组算法要求算法的实现思路算法实现算法要求样例 1: 输入: A=[1], B=[1] 输出:[1,1] 样例解释: 返回合并后的数组。样例 2: 输入: A=[1,2,3,4], B=[2,4,5,6] 输出: [1,2,2,3,4,4,5,6] 样例 3: 输入: A=[1,2,3,4], B=[5, 6, 7...原创 2019-06-13 10:59:26 · 167 阅读 · 0 评论 -
剑指offer-数值的整数次方(快速幂)
要求实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题思路1.(exp & 1) == 1,用于判断 exp 是否是奇数2.其中 Power(2,3),表示的意思是 2 * 2 * 2Power(2.5,3),表示的意思是 2.5 * 2.5 * 2.53.实现p...原创 2019-07-31 10:31:17 · 109 阅读 · 0 评论 -
剑指offer-打印从1到最大的n位数
题目要求输入数字n,按顺序打印从1到最大的n位十进制。比如输入3,则打印出1,2,3一直到最大的三位数是999思路1.看到此问题最简单的想法,就是先计算出最大值,循环遍历输出每一个值即可。但是问题是,没有考虑到int,甚至是long类型的最大值的问题,如果输入的n,已经不能用int或者long类型表示最大值的时候,这种方式就是不可行的。2.使用字符,字符串,或是数组来解决问题。需要考虑...原创 2019-07-31 11:41:16 · 114 阅读 · 0 评论 -
剑指offer-删除链表中的节点
题目要求在O(1)时间内删除链表节点:给定单项链表的头指针和一个节点指针。定义一个函数在O(1)时间内删除该节点。思路1.已知链表的头结点head,删除的节点为node,那么最简单的方式,就是从头结点遍历链表,当pNext节点的下一个节点是node,也就是需要删除的节点的时候,我们将 pNext 的下一个节点指向node的下一个节点,也就达到了删除node节点的目的。由于这种方式,需要顺...原创 2019-07-31 14:18:55 · 171 阅读 · 0 评论 -
剑指offer-删除链表中重复的节点
算法要求删除链表中重复的节点:在一个排序的链表中,如何删除重复的节点?已知链表的节点是1->2->3->3->4->4->5 ,删除重复的链表节点。链表变成了 1->2->5思考如果链表为空,或者只有一个结点,直接返回。如果链表结点大于等于2,则比较当前结点和下一个结点是否相同,如果相同,则删除当前结点和下一个结点,比较下下个结点...原创 2019-07-31 15:17:50 · 124 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
题目要求输入一个链表的头节点,从尾到头反过来打印每个节点的值思路1.如果链表从头往后打印每一个节点,那就遍历一次链表就好了2.但是此时是从尾部开始遍历整个链表。如果说改变整个链表的方向的话,也就是在第一次遍历链表的时候,改变每一个节点链表的方向的话,那么会破坏原来的链表结构,这种方式其实是不可取的。由于链表是从头往后遍历链表,但是输出是从尾部向头部输出,这就类似于栈的特点,“后进先出”的...原创 2019-07-26 15:33:41 · 74 阅读 · 0 评论 -
剑指offer-重建二叉树
题目要求重建二叉树:输入某二叉树的前悬遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不包含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如图所示的二叉树。重建的二叉树如下图所示:思路已知前序遍历 {1,2,4,7,3,5,6,8}和中序遍历 {4,7,2,1,5,3,8,6},...原创 2019-07-26 16:15:55 · 73 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
1.要求调整数组顺序使奇数位于偶数前面:输入一个整数数组,实现一个函数来调整改数组中的数字的顺序,使得所有奇数位于数组的前半部分,所有的偶数位于数组的后半部分。2.思考1.假设数组是 arr[] = {1,4,2,3,5,6}。2.想法1(使用队列queue 记录遇到的偶数的索引),遍历数组arr ,当遇到奇数(1)的时候,不做任何处理,如果遇到当前值是偶数(4)的话,将当...原创 2019-07-31 19:52:54 · 97 阅读 · 0 评论 -
剑指offer-单例模式
单例模式定义和特点思路代码实现定义和特点单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式单例模式有 3 个特点:1. 单例类只有一个实例对象;2. 该单例对象必须由单例类自行创建;3. 单例类对外提供一个访问该单例的全局访问点;思路单例模式,有“懒汉式” 和 “饿汉式”,等不同的形式主要思路就三步:1.私有化构造函数(防止外部实例...原创 2019-07-23 11:58:51 · 159 阅读 · 0 评论 -
剑指offer-链表中倒数第k个节点
算法要求输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。思路1.简单的实现方式:目标是找到链表中倒数第k个节点,那么从链表头数的话,也就是整数 n - k +1 (n为链表的长度,k表示倒数第几个节点)1....原创 2019-08-01 10:23:29 · 118 阅读 · 0 评论 -
剑指offer-链表中环的入口节点
算法要求如果一个链表中包含环,如何找到环的入口节点?例如如下图所示:环的入口节点是节点3;思考1.如何在链表中确定有一个环呢?2.如何在链表中找到环的入口的节点呢?基于以上的思考,我们可以想象。1.使用两个链表的指针,快指针和慢指针,快指针 (fast)一次移动两个节点,慢指针 (slow)一次移动一个节点。当快指针(fast) 的next为空的情况下,说明没有环。如果 fast...原创 2019-08-01 17:43:09 · 78 阅读 · 0 评论 -
剑指offer-二叉树的镜像
算法要求:二叉树的镜像:请完成一个函数,输入一棵二叉树,改函数输出它的镜像。也就是形如如下的图:左图是原二叉树,右图是镜像的二叉树思路:1.使用递归的方式实现。先遍历根节点,如果根节点存在左右节点的话。先将左节点和右节点互换位置。然后左(left)右(right)节点入队列queue.先从queue中出队列,得到节点left,此时left为根节点。如果根节点存在左右节点,那么就替换...原创 2019-08-06 11:28:43 · 103 阅读 · 0 评论 -
剑指offer-对称二叉树
算法要求对称的二叉树:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它就是对称的。如下图的思路:如何判断一棵二叉树是否是对称的呢?思路1:二叉树的遍历方式有,前序遍历,中序遍历和后序遍历。如果有一种对称的遍历算法的话,比如说,前序遍历算法,那么它的对称算法则是一种 先遍历根节点,再遍历右节点,再遍历左节点。对于以上的图1,前序遍历算法是{8,6...原创 2019-08-06 14:00:03 · 104 阅读 · 0 评论 -
剑指offer-包含min函数的栈
算法要求定义栈的数据结构,请再该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路定义两个栈 datastack 和 minstack。datastack,用户记录存储入栈操作的数据;minstack,用于记录每次存入栈中此时栈中最小的栈的元素,此最小值位于栈顶比如,现在入栈3,4,2,1。分析此时两个栈种元素的变化,已经...原创 2019-08-06 14:47:32 · 92 阅读 · 0 评论 -
剑指offer-二进制中1的个数
要求请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。思路1.最简单的方法是,将整数转化成二进制,统计这个二进制中1的个数就行了2.使用移位运算,任意整数和1进行 与 运算,如果该整数的最后一位 等于1,那么最后的结果是1,否则都是0,然后整数右移一位,继续判断最后一位是否是1,知道该整数位移到0。3.使用 n & (n ...原创 2019-07-30 19:38:23 · 73 阅读 · 0 评论 -
剑指offer-合并两个排序的数组
题目要求已知两个已经排好序的数组A1,A2,将两个排序的数组合并到一起,并使之合并的数组也是排序的数组。例如已知两个排序的数组是 {1,2,3,4},{2,4,5,6},那么合并后的排序的数组是{1,2,2,3,4,4,5,6}思路1.如果遍历两个数组的话,从前遍历两个数组,判断两个数组中的大小,从而合并成一个大的排好序的数组的话,这种解决方案,会出现多次复制一个数字的情况,更好的额解决方...原创 2019-07-25 16:29:15 · 311 阅读 · 1 评论 -
剑指offer-两个队列实现栈操作,两个栈实现队列的操作
两个队列实现栈-两个栈实现队列1.两个队列实现栈操作1.1 算法要求1.2 算法的实现思路1.3 算法的实现2 两个栈实现队列2.1 算法要求2.2 算法的实现思路2.3 算法的实现1.两个队列实现栈操作1.1 算法要求使用两个队列,实现栈的操作栈的特点是:先入栈,后出栈的特点1.2 算法的实现思路1.假设入栈操作的数为1,2,3.那么出栈的顺序是3,2,1。如何使用两个队列实现呢?...原创 2019-06-13 20:41:29 · 103 阅读 · 0 评论 -
剑指offer-旋转数组中的最小数字
查找旋转数组中的最小的数字1.算法要求2.算法的实现思路3.算法的实现1.算法要求1.把一个排序好的数组,将数组中的前n个数字搬到数组的后面,从而实现旋转数组,并从中找到最小的数字2.例如原数组是:{1,2,3,4,5},旋转之后的数组,可能是{3,4,5,1,2},那么就需要在旋转后的数组中,找到数字最小的值也就是12.算法的实现思路其实,这一个算法题,最简单的实现方式,就是遍历数组...原创 2019-06-14 15:29:14 · 79 阅读 · 0 评论 -
剑指offer-二叉树的下一个节点
中序遍历二叉树的下一个节点1.算法要求2.算法实现思路3.算法实现4.测试结果1.算法要求给定一个二叉树和一个已知的节点,如果找出中序遍历的下一个节点,树中的节点,除了有父节点指向左右两个指针,还有子节点指向父节点的指针。图一:每一个子节点都都一个指向父节点的指针(黑色表示父节点指向子节点的指针,红色表示子节点指向父节点的指针)2.算法实现思路中序遍历:先遍历左节点,在遍历根节点,再遍...原创 2019-06-17 11:16:10 · 94 阅读 · 0 评论 -
剑指offer-两个栈实现队列
题目要求用两个栈实现一个队列,队列的要求是,队尾插入数据,队头删除数据。实现思路栈是先进后出,队列是先进先声明两个栈stack1 和 stack2 ,先入队a,b,c,之后出队列a,b,之后入队d,在出队列c,队列还剩一个d先入队的数据,先入栈,依次存入a,b,c。a在栈底,c在栈顶。此时需要出队,那么就需要a先出对列。但是此时a在栈底。所以先将stack1中的所有数据出栈,然后入栈...原创 2019-07-29 11:38:38 · 107 阅读 · 0 评论 -
剑指offer-两个队列实现栈
题目要求两个队列实现一个栈的操作思路1.假设先入栈a,b,c。(那么a在栈底,c在栈顶),出栈两次操作,得到c,b,(此时栈中还有一个a),之后在入栈d,(此时栈中栈顶是d,栈底是a)在出栈d,栈中还有a。2.假设队列 queue1 和 queue2 用来模拟栈操作3.先往队列queue1中入队a,b,c。出栈操作,如果queue1中的队列长度为1,那么直接出队列,否则的话,先将queu...原创 2019-07-29 13:38:43 · 144 阅读 · 0 评论 -
剑指offer- 数组中重复的数字
题目要求数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路1.先将数组进行排序,然后在排序后的数组中查找重复的数据,比较容易,只需要从头到尾扫描数组就行...原创 2019-07-24 15:00:34 · 133 阅读 · 0 评论 -
剑指offer-斐波那契数列
题目要求求斐波那契数列的第n项由于斐波纳挈数列是以兔子的繁殖引入的,因此也叫“兔子数列”。它指的是这样一个数列:0,1,1,2,3,5,8,13…从这组数可以很明显看出这样一个规律:从第三个数开始,后边一个数一定是在其之前两个数的和。在数学上,斐波纳挈数列可以以这样的公式表示:F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2),(n>=2)思路(1)....原创 2019-07-29 17:26:50 · 117 阅读 · 0 评论 -
剑指offer-旋转数组的最小数字
题目要求旋转数组的最小数字:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小值。例如{3,4,5,1,2},是{1,2,3,4,5}的一个旋转数组,改数组的最小值是1思路1.使用二分查找法,假设某一个旋转后的数组是arr = {3,4,5,1,2},则索引start = 0,end = arr.lenght - 1;2...原创 2019-07-29 20:00:23 · 72 阅读 · 0 评论 -
剑指offer-矩阵中的路径
题目要求package com.offer.test;/** * * 矩阵中的路径 * 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、 上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入 该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路...原创 2019-07-30 10:15:44 · 83 阅读 · 0 评论 -
剑指offer-剪绳子
算法要求给你一根长度为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思路动态规划首先定义函数f(n)为把长度为n的绳子剪成若干段后各段长度乘积的最大值。在剪第一刀...原创 2019-07-30 11:04:12 · 128 阅读 · 0 评论 -
剑指offer- 二维数组中查找
题目要求在一个有序的二维数组中,查找某一个值是否在二维数组中。有序的二维数组,指的的是在每一行的数据都是从左到右递增的,每一列都是从上到下递增的,在这个有序的二维数组中查找某一个值是否在。思路假设二维数组是如下图,查找 7 是否在二维数组中1.这种查找起始位置在右上角的方式,也可以此时从左下角的位置开始查找代码实现package com.offer.test;/** *...原创 2019-07-25 11:09:44 · 132 阅读 · 0 评论 -
剑指offer- 替换空格
题目要求请事先一个函数,把字符串中的每个空格替换成“%20”。例如:输入“We are happer.”,输出“We%20are%20happer.”.思路1.时间复杂度是O(n2)解法从头到尾扫描字符串,如果碰到空格字符串的时候,我们就将此空格替换成“%20”,也就是将一个字符替换成3个字符串,此时需要将原来的字符串往后移动两个字符串的位置比如遇到第一个字符串空格的时候,需要替换“...原创 2019-07-25 13:50:13 · 146 阅读 · 0 评论 -
剑指offer-合并两个排序好的链表
算法要求输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。例如两个链表:链表1和链表2,合并排序成链表3实现思路1.使用递归实现:定义一个新的链表3的 head 头结点。假设currentNode1 和currentNode2分别指向 两个链表的首节点,由于链表节点1 小于 链表2节点2 。所以链表3的head 头结点的下一个节点指向链表1的节点1.curre...原创 2019-08-02 20:21:40 · 107 阅读 · 0 评论 -
剑指offer-反转链表
算法要求定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点思路1.使用递归的方式实现。假设链表为 1-> 2 - > 3 -> 4 -> 5 -> 6 -> null;head为当前的节点,pNext 为当前节点的下一个节点。那么每一个链表的后继节点指向当前节点的话,不就实现了链表的反转。2.使用辅助空间,实现链表的反转,此方式比...原创 2019-08-02 10:51:27 · 96 阅读 · 0 评论