
剑指offer
Manduner_TJU
If you have a dream,you got to protect it!
展开
-
查找算法——006查找旋转数组中的最小数字
1,问题描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组(即,递增的数组)的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2,解题思路先吐槽一下,看到网上很多解题思路,超麻烦,包括自己手写数组的排序算法,...原创 2019-01-09 23:19:24 · 574 阅读 · 2 评论 -
位运算——012数值的整数次方
1,问题描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2,解题思路利用快速幂的解法,快速幂公式如下:该方法体现的就是递归的思想,源码如下:3,源码public class Solution { public double Power(double base, int exponent) { ...原创 2019-03-14 22:30:13 · 246 阅读 · 0 评论 -
树——017树的子结构
1,问题描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2,解题思路(转自:完美风暴4)(1)要查找树A中是否存在和树B结构一样的子树,我们可以分两步:第一步在树A中找到和B的根节点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。(2)以上面的两棵树为例来详细分析这个过程。首先我们试着在树A中找到值...原创 2019-03-18 20:46:41 · 144 阅读 · 0 评论 -
树——023二叉搜索树的后序遍历序列
1,问题的描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2,解题思路二叉树后序遍历序列的最后一个值是根节点的值,二叉搜索树后序遍历序列的合法性条件是:先根据根节点的值将后序遍历序列分为左右两个序列,左边序列所有元素应该都小于根节点的值,右边序列所有元素应该都大于根节点的值。左右两个序列同样应...原创 2019-03-29 21:38:10 · 201 阅读 · 0 评论 -
链表——016合并两个排序的链表
1,问题描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。注:em。。。。。。。。。。这是我面试的一家公司的编程题,相对来说还是挺简单的,遇到这样的面试官,就偷着乐吧0.02,解题思路有两种思路,一种是:遍历一个链表,插入另一个链表里。另一种是采用递归的方式,比较两个链表头结点的值的大小,返回值较小的那个节点。相对来说,更推荐采用递归方...原创 2019-03-17 23:10:11 · 177 阅读 · 0 评论 -
排序——029最小的K个数
1,问题描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。2,解题思路(1)思路一:直接利用各种排序算法(快排、冒泡排序、选择排序、堆排序)对数组进行从小到大的排序。然后输出前K个。这种方法容易想到,但不是最优的算法。(2)思路二:将原数组的前K个元素构建成一个最大堆,然后从第K+1个元素开始,依次和堆...原创 2019-04-24 17:24:19 · 220 阅读 · 0 评论 -
链表——003从尾到头打印链表
1,问题描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。2,求解思路(1)理解题意 刚开始看这个题的时候是懵的,因为还没接触过java中链表类型,想象不出输入的链表是啥样的。后来观察到原题中给出了链表中节点类的定义。在此回忆下数据结构中的链表:一个链表由多个节点组成,每个节点(ListNode)由两部分组成,即节点值(value)和指针(next)...原创 2018-12-19 23:21:26 · 212 阅读 · 0 评论 -
链表——014链表倒数第k个节点
1,问题描述输入一个链表,输出该链表中倒数第k个结点。2,解题思路倒数第k个节点和最后一个节点的距离是k-1,假设现在有两个指针分别指向倒数第k个节点和最后一个节点,那么指向倒数第k个节点的指针走k-1步就能到达最后一个节点,也就是说两个指针的间隔是k-1。所以我们可以先设定两个同时指向头结点的指针a和b,先让a指针走k-1步,此时a和b的间隔就是k-1;然后让a和b同时向后走,直...原创 2019-03-15 23:20:24 · 119 阅读 · 0 评论 -
树——024二叉树中和为某一值的路径
1,问题描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)2,解题思路(1)注意事项满足该题条件的路径一定是从根节点到叶节点,也就是说,即使根节点到某个非叶子节点的节点值之和等于目标值,那该条路径也不能算作本题定义的路径。 如...原创 2019-04-01 22:57:12 · 146 阅读 · 0 评论 -
动态规划——030连续子数组的最大和
1,问题描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续...原创 2019-05-06 19:53:13 · 243 阅读 · 0 评论 -
其他算法——031整数中1出现的次数(从1到n整数中1出现的次数)
1,问题描述 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。2,解题...原创 2019-05-06 21:03:48 · 150 阅读 · 0 评论 -
数组——032把数组排成最小的数
1,问题描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。2,解题思路先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。排序规则如下:若ab > ba 则 a > b,若a...转载 2019-05-07 21:22:37 · 138 阅读 · 0 评论 -
剑指offer题目归类
1,数据结构类题目(1),数组001-二维数组中的查找006-旋转数组的最小数字013-调整数组顺序使奇数位于偶数前面028-数组中出现次数超过一半的数字030-连续子数组的最大和032-把数组排成最小的数035-数组中的逆序对037-数字在排序数组中出现的次数040-数组中只出现一次的数字050-数组中重复的数字051-构建乘积数组(2),链表003-从尾到头打...原创 2019-05-08 23:47:08 · 324 阅读 · 1 评论 -
其他算法——顺时针打印矩阵
1,问题描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.2,解题思路(1)每次将矩阵的第一行元素依次添加至列表中,(2)然后将剩余的矩阵逆时针旋转(3)重...原创 2019-03-27 18:47:17 · 245 阅读 · 0 评论 -
数组——数组中的逆序对
1,问题描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。输入描述:题目保证输入的数组中没有的相同的数字,数组大小的范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据...原创 2019-06-25 12:23:51 · 295 阅读 · 0 评论 -
数组——数组中只出现一次的数字
1,问题描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2,解题思路有两种解题思路:(1)桶排序1)遍历数组array,找到数组中最大值max;2)构建辅助数组a,长度为max+1;3)遍历数组array,array中的元素作为a数组中的下标值,array中的元素每出现一次,a数组相对应下标的数组元素值加1(桶排序的思想);4)遍历...原创 2019-06-26 14:38:19 · 404 阅读 · 0 评论 -
链表——025复杂链表的复制
1,问题的描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)2,解题思路(转自牛客网)(1)遍历链表,复制每个节点并将该复制后的新节点放至旧节点之后,先不用管每个节点的随机节点(2)重新遍历链表,复制旧节点的随机指针...原创 2019-04-02 17:14:20 · 153 阅读 · 0 评论 -
位运算——011二进制中1的个数
1,问题描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。2,解题思路(1)利用Integer.toBinaryString()方法先将整数(包含有符号整数)转换为二进制字符串str形式(2)利用str.toCharArray()将(1)中的字符串转化为字符数组(3)遍历字符数组,先将字符转化整型数字,然后再加和。此题较简单:就是将二进制中的所有数进行加和...原创 2019-03-09 11:24:30 · 459 阅读 · 0 评论 -
动态规划——009变态跳台阶
1,问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。2,解题思路解题思路同上一篇博客跳台阶3,源码public class Solution { public int JumpFloorII(int target) { if(target==0){ retur...原创 2019-03-08 21:25:54 · 164 阅读 · 0 评论 -
其他算法——002替换空格
1,问题描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2,解题思路(1)将StringBuffer对象转换成字符串(2)正则表达式实现替换3,源码public class Solution { public String replaceSpace(S...原创 2018-12-19 10:35:58 · 130 阅读 · 0 评论 -
链表——015反转链表
1,问题描述输入一个链表,反转链表后,输出新链表的表头。2,解题思路(1)首先,保留链表头节点的next节点,其中,设头结点为aNode(aNode = head),它的下一个节点为bNode = aNode.next。(2)然后,将aNode.next置空,即,aNode.next = null。此时aNode就表示一个新链表(只有一个节点),aNode也是该链表的头结点。(...原创 2019-03-17 14:46:36 · 240 阅读 · 0 评论 -
动态规划——007斐波那契数列
1,问题描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=392,解题思路(1)首先得知道什么是斐波那契数列,通常情况下斐波那契数列的第一项和第二项是1,从第三项开始,每一项的值等于前两项之和,即:1,1,2,3,5......(2)需要注意的是,该题目限定从第0项开始,第0项的值为0,那么数列应该为:0,1,1,...原创 2019-02-25 22:13:49 · 176 阅读 · 0 评论 -
树——004重建二叉树
1,问题描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。2,解题思路解题思路(一):(1)前序遍历序列中的第一元素是二叉树的根节点,题目中根节点的值是1。(2)从中序遍历序列中找到根节点值...原创 2018-12-20 21:04:14 · 220 阅读 · 0 评论 -
动态规划——010矩形覆盖
1,问题描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?2,解题思路(1)假设有n个2*1的小矩形时的覆盖方法为f(n),则分析如下:(2)我们只关注最后面的一个矩形是横着放还是竖着放。如果是竖着放的,其对应的方法数为n-1个矩形的方法,如果是横着放的,其对应的方法数为n-2个矩形的方法数,n个矩形...原创 2019-03-08 22:23:08 · 240 阅读 · 0 评论 -
动态规划——008跳台阶
1,问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。2,解题思路(1)先假设有n阶台阶的时候有f(n)种跳法(2)当n = 1时只有一种跳法,即,f(1) = 1; 当n = 2时有两种跳法,即,f(2) = 2; 当n = 3时,一共有多少种跳法,只和第一次跳的选...原创 2019-03-08 21:20:07 · 203 阅读 · 0 评论 -
树——018二叉树的镜像
1,问题描述操作给定的二叉树,将其变换为源二叉树的镜像。2,解题思路这道题的思路倒是不难,就是利用递归的思路,如下:先将根节点的左右子树调换; 再递归处理根节点的左右子树。但是这个题有两种特殊的二叉树需要考虑到,一种是只有左子树,一种是只有右子树。下面给出了自己写的有些冗余的代码,以及优化后的代码。3,源码自己写的代码(代码有些冗余)/**public cla...原创 2019-03-19 18:22:07 · 118 阅读 · 0 评论 -
栈和队列——005用两个栈实现队列
1,问题描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。2,解题思路(1)明确栈和队列的含义栈是先进后出 队列是先进先出(2)用stack1做入队操作,这一步没有需要特别注意的地方,来一个入一个就行(3)用stack2做出队操作,基本思想是先把stack1中的元素依次弹出放到stack2中,再把stack2中的元素弹出即可。但是需要注...原创 2018-12-21 20:00:14 · 159 阅读 · 0 评论 -
数组——013调整数组顺序使奇数位于偶数前面
1,部分面经至今,虽然才面试了两家公司(算法工程师方向),但是收获还是不小的,其中一部分收获就是关于编程题。记得我之前的一篇博客吐槽过,为啥一些IT大牛在做编程题的时候,不用java或者python封装的工具直接实现某些功能(例如:用java中的Arrays.sort()实现数组排序),而是非得通过下标转换去实现这些功能呢(例如,通过下标变换写各种排序算法)。。。。才面试了两家公司,我就悟...原创 2019-03-15 21:25:38 · 266 阅读 · 0 评论 -
数组——028数组中出现次数超过一半的数字
1,问题描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2,解题思路(1)思路一:遍历数组,统计每个元素出现的次数。思路简单,但是时间复杂度是O(n^2).(2)思路二:阵地攻守。阵地攻守思想:先找出可能的目标...原创 2019-04-08 16:53:06 · 159 阅读 · 0 评论 -
栈和队列——021栈的压入、弹出序列(判断栈的出入合法性)
1,问题描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2,解题思路首先构建一个辅助栈,然后遍历入栈序列,遍历操作包含:(1)先将...原创 2019-03-28 15:30:29 · 231 阅读 · 0 评论 -
查找算法——001二维数组中的查找
1,开篇(写给自己)研三的师兄师姐们毕业了,意味着自己也马上要找工作了。俺也趁早刷刷编程题,为找工作打好基础。加油吧,骚年,人不努力枉少年哇!2,问题描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。3,源码import java....原创 2018-12-18 22:51:25 · 180 阅读 · 0 评论 -
栈和队列——020包含min函数的栈
1,问题描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。2,解题思路em。。。。我觉得这道题的难点是题意理解上,只要把问题理解了,那解题思路还是较简单的。这道题是让我们设计一个栈结构(此时的Solution类就是我们要设计的栈对象,最后牛客系统测试的时候也是将Solution当作一个栈对象来操作),这个栈除了包含常用的“弹出...原创 2019-03-27 23:36:27 · 159 阅读 · 0 评论 -
树——022从上往下打印二叉树(二叉树的层次遍历)
1,问题描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。2,解题思路首先构建一个辅助队列存放二叉树节点,那么接下来该如何层次遍历呢?步骤如下:将根节点添加到队列中 循环判断队列是否为空,若不为空则执行以下循环体语句: 将队列头节点取出,再将该节点不为空的左右子树的根节点依次添加至队列中,然后把该节点的值添加到列表中 循环至队列为空,返回列表3,源码impor...原创 2019-03-29 14:56:34 · 481 阅读 · 0 评论 -
数组——构建乘积数组(python实现)
1,问题描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。2,解题思路(1)计算B数组的下三角,B[i]=B[i−1]∗A[i−1]B[i] = B[i-1]*A[i-1]B[i]=B[i−1]∗A[i−1] 其中i∈[1,n−1],B[0]=1,ni\in[1...原创 2019-07-30 12:58:23 · 1468 阅读 · 0 评论