剑指Offer
我要 Offer
时光·漫步zth
辛酸泪,影单醉。
展开
-
剑指Offer——题7(重建二叉树)
【题目】:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。【思路】:前序遍历第一个值就是根结点的值,根据该值在中序遍历的位置,可以找出该根结点左右子树,然后找出左右子树的前序遍历和中序遍历,然后采用递...原创 2019-07-29 09:52:08 · 131 阅读 · 0 评论 -
剑指Offer——题15(二进制中 1 的个数)
【题目】:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。【思路】: 方法一:先把整数n与1做与运算,判断最低位是否为1;接着把1左移一位,与n做与运算,可以判断次低位是否为1……反复左移,即可对每一个位置都进行判断,从而可以获得1的个数。这种方法需要循环判断32次。注:不可将n 右移与...原创 2019-08-09 09:33:35 · 120 阅读 · 0 评论 -
剑指Offer——题16(数值的整数次方)
【题目】:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。【思路】:很容易实现,但需要注意以下陷阱: 1)0的负数次方不存在;2)任意数的0次方为 1;3)要考虑exponent为负数的情况。所以可以对exponent进行分类讨论,在对base是否为0进行讨论。根据以上公式,减少计算次数,提高效率。使用右移运算符...原创 2019-08-09 11:25:38 · 242 阅读 · 1 评论 -
剑指Offer——题17(打印从 1 到最大的 n 位数)
【题目】:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。【思路】:解决这个问题的关键是大数问题。最常用的方法是用字符串或字符数组表达大数。针对本题,需要解决的问题是在字符串或字符数组表达的大数中模拟加法、打印大数。package com.offer.offer17;/** * @author zth * @D...原创 2019-08-10 09:41:03 · 180 阅读 · 0 评论 -
剑指Offer——题18(在 O(1) 时间内删除链表节点、删除链表中重复的节点)
【题一】在 O(1) 时间内删除链表节点【题目】:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。【思路】:常规思维是从头开始顺序查找需要删除的节点,需要的时间为O(n)。要在O(1)时间删除某结点,可以这样实现:设待删除结点 i 的下一个结点为 j,把 j 的值复制到 i ,再把 i 的指针指向 j 的下一个结点,最后删除 j,效果就相当于删除j。...原创 2019-08-10 15:10:03 · 169 阅读 · 0 评论 -
剑指Offer——题19(正则表达式匹配)
【题目】:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配【思路】:使用函数matchCore(char[] str, int indexO...原创 2019-08-10 22:24:48 · 174 阅读 · 0 评论 -
剑指Offer——题20(表示数值的字符串)
【题目】:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。【思路】表示数值的字符串应该符合:A[.[B]][e|EC] 或者 .B[e|EC]package com.offer.offe...原创 2019-08-11 10:20:17 · 210 阅读 · 0 评论 -
剑指Offer——题21(调整数组顺序使奇数位于偶数前面)
【题一】(剑指Offer)输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。【思路】: 设置一个指针,从前往后走,如果遇到奇数则指针后移,遇到偶数时,希望把该偶数放在数组后面;因此,再设置一个指针,从后往前走,遇到偶数时指针前移,遇到奇数时,则恰好可以与前面的指针所指的偶数进行调换。package com.offer....原创 2019-08-11 15:28:06 · 188 阅读 · 0 评论 -
剑指Offer——题22(链表中的倒数第 K 个节点)
【题目】:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。【思路】:方法一:设置两个指针,第一个指针先遍历 k-1 步;从第 k 步开始,第二个指针指向头结点,两个结点同时往后遍历,当第一个指针到达最后一个...原创 2019-08-11 17:11:29 · 122 阅读 · 0 评论 -
剑指Offer——题23(链表中环的入口节点)
【题目】:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。【思路】:1.确定链表是否有环:定义两个指针,一个一次走一步,一个一次走两步,如果走的快的追上了走的慢的,则包含环。如果走的快的到了链表末尾都没追上则不包含环。2.确定环中结点的数目n:从环中的一个节点开始,边走边计数,回到开始节点,则统计出环中的节点数。3.找到环的入口:定义两个指针,一个指针...原创 2019-08-13 00:41:40 · 143 阅读 · 0 评论 -
剑指Offer——题24(反转链表)
【题目】:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。【思路】:使用三个指针进行实现。分别指向当前节点、前一个节点和后一个节点。前一个节点的指针是为让当前指针指向,后一个节点为了防止链表断开。package com.offer.offer24;/** * @author zth * @Date 2019-08-13 8:10 */class...原创 2019-08-13 08:40:05 · 108 阅读 · 0 评论 -
剑指Offer——题14(剪绳子)
【题目】:给你一根长度为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。【思路】:本题采用动态规划或者贪婪算法可以实现。一开始没有思路时,可以从简单的情况开始想,试着算以...原创 2019-08-09 00:42:36 · 142 阅读 · 0 评论 -
剑指Offer——题13(机器人的运动范围)
【题目】:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?【思路】:采用回溯法,先判断机器人...原创 2019-08-08 23:11:56 · 170 阅读 · 0 评论 -
剑指Offer——题12(矩阵中的路径)
【题目】:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为...原创 2019-08-08 20:22:42 · 209 阅读 · 0 评论 -
剑指Offer——题8(二叉树的下一个节点)
【题目】:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。【思路】:1. 若当前结点有右子树时,其下一个结点为右子树中最左子结点;2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点; (2)若当前结点为其父结点的右子结点时,继续向上遍历父结点的父...原创 2019-07-29 10:41:33 · 97 阅读 · 0 评论 -
剑指Offer——题9(用两个栈实现队列)
【题目】:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。【思路】:将元素从stack1出栈,压到另一个栈 stack2 中,然后再从 stack2 中出栈就OK了。当stack2中还有元素,stack1中的元素不能进入stack2;当stack2中没元素时,stack1中的所有元素都...原创 2019-07-29 15:02:36 · 117 阅读 · 0 评论 -
剑指Offer——题2(实现 Singleton)模式
方法一:饿汉模式package com.offer.offer01;/** * @author zth * @Date 2019-07-27 15:41 * 饿汉模式 */public class HugerSingleton { private HugerSingleton(){} private static final HugerSingleton si...原创 2019-07-27 20:49:48 · 108 阅读 · 0 评论 -
剑指Offer——题3(数组中重复的数字)
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字 2 或者 3。思路一:改变原来的数组把扫描的每个数字(如数字m)放到其对应下标(m下标)的位置上,若同一位置有重...原创 2019-07-20 11:53:13 · 98 阅读 · 0 评论 -
剑指Offer——题4(二维数组中的查找)
【题目】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。【思路】从右上角开始查找, 当 n 列第 1 个元素大于目标元素,则去第 n-1 列查找。如果小于第一个元素,则在该列的下一行查找,如果相等,则给数组包含公司元素。/** * @author zth * ...原创 2019-07-28 09:46:58 · 114 阅读 · 0 评论 -
剑指Offer——题5(替换空格)
【题目】:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。【解题思路】:先计算出需要的总长度,然后从后往前进行复制和替换,则每个字符只需要复制一次即可。时间效率为O(n)。package com.offer.offer05;public class Solution { publi...原创 2019-07-28 10:37:37 · 147 阅读 · 0 评论 -
剑指Offer——题6(从尾到头打印链表)
【题目】:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。【思路】:从尾到头,是典型的“后进先出”问题,使用栈,从而也可以使用递归。package com.offer.offer06;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Stack;/** * @...原创 2019-07-28 12:43:52 · 87 阅读 · 0 评论 -
剑指Offer——题10(斐波拉契数列)
【题一】:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。【思路】:如果直接写递归函数,由于会出现很多重复计算,效率非常底,不采用。要避免重复计算,采用从下往上计算,可以把计算过了的保存起来,下次要计算时就不必重复计算了:先由f(0)和f(1)计算f(2),再由f(1)和f(2)计算f(3)……以此类推就行了,计算第n个时,只要保存第n-1和第n-2项就可以...原创 2019-08-01 19:40:31 · 190 阅读 · 0 评论 -
剑指Offer——题11(旋转数组的最小数)
【题目】:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。【思路】:旋转后的数组可以划分为两个排序的子数组,并且前面数组的元素大于等于后面数组的元素。最小的元素刚好是这两个数组的分界点,所以采用二分查找法。...原创 2019-08-08 16:02:00 · 149 阅读 · 0 评论 -
剑指Offer——题26(树的子结构)
【题目】:输入两棵二叉树A和B,判断B是不是A的子结构【思路】:1)先对A树进行遍历,找到与B树的根结点值相同的结点R;2)判断A树中以R为根结点的子树是否包含B树一样的结构。【注意】:判断浮点数相等不能直接用 “==“ 判断。package com.offer.offer26;/** * @author zth * @Date 2019-08-13 10:3...原创 2019-08-13 15:46:44 · 162 阅读 · 0 评论 -
剑指Offer——题25(合并两个排序的链表)
【题目】:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。【思路】:递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现:当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接。非递归实现:每次比较拿出最小值,当一个链表为空时,...原创 2019-08-13 09:57:30 · 128 阅读 · 0 评论