![](https://img-blog.csdnimg.cn/20200605131043755.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指offer
题目及解答
楼上有只喵
Java不归路。。。
展开
-
剑指Offer——题4(二维数组中的查找)
1.题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。如: 2.解题思路从右上角开始查找, 第0行,第n列开始,当 n 列第 1 个元素大于目标元素,则去第 n-1 列查找。如果小于第一个元素,则在该列的下一行查找,如果相等,则给数组包含此元素。3.代...原创 2019-07-29 00:04:02 · 100 阅读 · 0 评论 -
剑指Offer——题18(在 O(1) 时间内删除链表节点、删除链表中重复的节点)
1.1题目在 O(1) 时间内删除链表节点给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。1.2.思路在单向链表中,因为我们需要得到被删除节点的前一个节点,常规思维是从头节点开始遍历需要删除的节点,需要的时间是O(n),也可以这样实现:我们要删除节点i,先把i的下一个节点的内容复制到j,然后把i的指针指向j的下一个节点,这时再删除结点j,就相当于删除...原创 2019-08-11 21:46:45 · 135 阅读 · 0 评论 -
剑指Offer——题22(链表中的倒数第 K 个节点)
1.题目输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。2.实现思路step1;定义两个指针,P1从头结点开始遍历,遍历到第k-1个节点,P2也开始从头结点遍历,step2:当P1指向末尾时,P2此时的指...原创 2019-08-20 22:55:15 · 56 阅读 · 0 评论 -
剑指Offer——题23(链表中环的入口节点)
1.题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2.思路step1.首先判断是否存在环:定义两个指针,一个一次走一步,一个一次走两步,快的指针能追上慢的指针则存在环,返回环中相遇的节点 。要是在到达链表尾部(即plow.next ==null),还没相遇,则不存在环 。step2:找入口节点:定义两个指针,第一个指针P1走环的长度的步数,第二个指...原创 2019-08-21 10:01:21 · 55 阅读 · 0 评论 -
剑指Offer——题24(反转链表)
1.题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。2.解题思路step1:定义三个指针:记录节点的前一个节点pre,当前节点pNode,后一个节点pNextstep2: 遍历节点,将他的next指向前一个节点pre,当pNext==null时,即此时的当前节点为反转链表后的头结点注意: 1.头结点为空 2.输入的链表只有一个节点3...原创 2019-08-21 10:11:02 · 73 阅读 · 0 评论 -
剑指Offer——题25(合并两个排序的链表)
1.题目输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。2.思路递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现:当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接注意:每当代码试图访问空指针指向的内存时,程序就会崩...原创 2019-08-21 16:48:47 · 107 阅读 · 0 评论 -
剑指Offer——题27(二叉树的镜像)
1.题目操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义: 2.思路从根节点开始,前序遍历二叉树,只要当前节点有子树,则交换左右子树位置注意:交换子树前先判断当前节点是否为空3.代码实现public class BinaryTreeMirror { class TreeN...原创 2019-08-21 18:05:47 · 84 阅读 · 0 评论 -
剑指Offer——题38(字符串的排列)
1.题目输入一个字符串,打印出该字符串中字符的所有排列。输入:abc输出:abc、acb、bac、bca、cab、cba。2.思路step1:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符进行交换。step2:每次都把一个数固定在前面,让后面的数递归地进行全排列,这样每个数都固定过以后就能找出所有排列。注:我们把每个数固定在前面并让后面的进行全排列完毕以...原创 2019-09-14 15:36:03 · 164 阅读 · 1 评论 -
字符串去重
题目要求输入:1133333555432输出:11335542原创 2019-09-14 18:16:34 · 475 阅读 · 0 评论 -
剑指Offer——题39(数组中出现次数超一般的数字)
1.题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2.实现思路 数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值: ...原创 2019-09-14 18:53:34 · 97 阅读 · 0 评论 -
剑指Offer——题42(连续数组的最大和)
1.题目输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。2.实现思路Step1.从头到尾逐个累加数组中的每个数字,首先加上第一个数字,从第二个数字开始累加,依次将累加和...原创 2019-09-14 19:56:12 · 112 阅读 · 0 评论 -
剑指Offer——题43(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.实现思路2.1 思路一累计1-n中每一个数中1出现的次数。...原创 2019-09-15 10:25:27 · 204 阅读 · 0 评论 -
剑指Offer——题21(调整数组顺序使奇数位于偶数前面)
1.题一 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。2.思路 设置一个指针,从前往后走,如果遇到奇数则指针后移,遇到偶数时,希望把该偶数放在数组后面;因此,再设置一个指针,从后往前走,遇到偶数时指针前移,遇到奇数时,则恰好可以与前面的指针所指的偶数进行调换。3.代码实现public class ...原创 2019-08-15 11:13:41 · 99 阅读 · 0 评论 -
剑指Offer——题17(打印从 1 到最大的 n 位数)
1.题目输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。2.思路解决这个问题的关键是大数问题。最常用的方法是用字符串或字符数组表达大数。针对本题,需要解决的问题是在字符串或字符数组表达的大数中模拟加法、打印大数。3.代码实现public class Print1ToN { public void prin...原创 2019-08-11 10:11:01 · 73 阅读 · 0 评论 -
剑指Offer——题16(数值的整数次方)
1.题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2.实现思路很容易实现,但需要注意以下陷阱:0的负数次方不存在; 任意数的0次方为 1; 要考虑exponent为负数的情况。所以可以对exponent进行分类讨论,在对base是否为0进行讨论。根据以上公式,减少计算次数,提高效率。使用右移运算符...原创 2019-08-10 23:08:52 · 64 阅读 · 0 评论 -
剑指Offer——题5(替换空格)
1.题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy2.解题思路:先计算出空格个数count,构建一个长度为原数组长度+count*2(‘%’,‘2’,‘0’占3个长度,空格原本占一个长度,所以这里乘2)的新数组,将原数组逆序输出,每输出一个判断其是否为空格(ASCL...原创 2019-07-29 00:13:23 · 79 阅读 · 0 评论 -
剑指Offer——题6(从尾到头打印链表)
1.题目输入一个链表的头结点,从尾到头反过来打印出每个结点的值。2.解题思路1.利用Stack栈后进先出。2.利用递归。class ListNode{ int val; ListNode next=null; public ListNode(int val) { this.val = val; }}public class Pr...原创 2019-07-29 16:11:40 · 74 阅读 · 0 评论 -
剑指Offer——题9(用两个栈实现队列)
1.题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。2.解题思路将要放的数依次push到stack1中,将stack1中的数pop出来,再push到Stack2中注意:只有stack2为空时,才可以往进push 新的值,否则顺序会乱;当其不为空直接进行pop3...原创 2019-08-02 15:34:56 · 79 阅读 · 0 评论 -
剑指Offer——题10(斐波拉契数列)
1.题目(一):写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。2 .思路如果直接写递归函数,由于会出现很多重复计算,效率非常底,不采用。要避免重复计算,采用从下往上计算,可以把计算过了的保存起来,下次要计算时就不必重复计算了:先由f(0)和f(1)计算f(2),再由f(1)和f(2)计算f(3)……以此类推就行了,计算第n个时,只要保存第n-1和第n-2项就...原创 2019-08-07 23:50:41 · 75 阅读 · 0 评论 -
剑指Offer——题7(重建二叉树)
1.题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。2.思路根据前序的第一个数字1,判断出根节点为1,则【4,7,2,1】和【5,3,8,6】为它的左子序列和右子序列 再根据前序遍历...原创 2019-08-01 17:11:36 · 87 阅读 · 0 评论 -
剑指Offer——题8(二叉树的下一个节点)
1.题目 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2.思路当前节点存在右子树,它下个节点是它当前节点的右节点的左节点的左节点的左节点。。。。 当前节点不存在右子树: (1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点; (2)若当前结点为其父结点的右...原创 2019-08-01 21:25:42 · 84 阅读 · 0 评论 -
剑指Offer——题11(旋转数组的最小数)
1.题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.思路可把旋转后的数组看做两个有序数组,以最小值为分界,前面的数大于最小值,后面的数小于最小值,左边的...原创 2019-08-08 21:03:31 · 88 阅读 · 0 评论 -
剑指Offer——题12(矩阵中的路径)
1.题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字...原创 2019-08-09 00:22:37 · 94 阅读 · 0 评论 -
剑指offer——题13(机器人的运动范围)
1.题目 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?2 实现思路机器人从[0,0]开...原创 2019-08-09 08:18:19 · 88 阅读 · 0 评论 -
剑指Offer——题15(二进制中 1 的个数)
1.题目 实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。2.思路方法一:先把整数n与1做与运算,判断最低位是否为1;接着把1左移一位,与n做与运算,可以判断次低位是否为1……反复左移,即可对每一个位置都进行判断,从而可以获得1的个数。这种方法需要循环判断32次(即要判断到int...原创 2019-08-09 11:35:01 · 76 阅读 · 0 评论 -
剑指Offer——题20(表示数值的字符串)
1.题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。2.思路表示数值的字符串应该符合:A[.[B]][e|EC] 或者 .B[e|EC]public class IsNumeri...原创 2019-08-14 22:24:35 · 82 阅读 · 0 评论 -
剑指Offer——题49(丑数)
1.题目把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。2.实现思路依次计算出丑数,设置三个指针,依次从小到大遍历这些求出的丑数,将这些指针所指的数分别乘2、3、5,再比较大小,将小的放进队列。3.代码实现public class GetUgl...原创 2019-09-15 11:24:39 · 82 阅读 · 0 评论